Announcement

Collapse
No announcement yet.

Bitte um Hilfe bei einer SQL-Query

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Bitte um Hilfe bei einer SQL-Query

    Hallo, ich habe eine Tabelle wie die folgende

    Code:
    peron_id      item1        item2       item3       item4
    
    120            good         bad         yes         no
    120          average      average       no         yes
    120            bad          bad         no          no
    120           good         good         yes        yes
    Ich möchte den prozentuellen Anteil von goods-averages-bads bzw. yes-nos für jede Spalte, bezogen auf eine person_id.
    Muss ich mehrere seperate Queries wie diesen machen:
    Code:
    SET @anzahl_item1 = SELECT COUNT(item1) FROM table_name WHERE item1 = 'good' AND person_id = @id GROUP BY person_id;
    SET @anzahl_gesamt = SELECT COUNT(person_id) FROM table_name WHERE person_id = @id;
    SET @prozent_item1 = (@anzahl_item1 * 100)/@anzahl_gesamt;
    Und das für jeden möglichen Wert und dann noch für jede Spalte ? Ich denke, T_SQL bietet hierfür sicher etwas komfortableres an.
    Bitte helft mir. Danke
    Zuletzt editiert von hmb; 18.02.2010, 15:21.

  • #2
    Pro möglichen Zustand (good/bad/average bzw. yes/no) und pro 'item' wird eine gesonderte Spalte benötigt. Die Abfrage für 'item1' Durchschnitte könnte so aussehen:

    Code:
    SELECT person_id,
    avg(CASE WHEN item1 = 'good' THEN 1 ELSE 0 END) AS Item1Good,
    avg(CASE WHEN item1 = 'average' THEN 1 ELSE 0 END) AS Item1Average,
    avg(CASE WHEN item1 = 'bad' THEN 1 ELSE 0 END) AS Item1Bad
    FROM tabelle 
    WHERE person_id = xx
    GROUP BY person_id
    Die Abfrage läßt sich entsprechend um die Spalten für item2, item3, ... erweitern. Für yes/no ist es äquivalent, halt nur mit einem Zustand weniger. Hoffe, das hilft...

    Comment


    • #3
      @Zunera, danke für die Anwort. Wie hast du das gemeint,
      Pro möglichen Zustand (good/bad/average bzw. yes/no) und pro 'item' wird eine gesonderte Spalte benötigt.
      Soll ich die Datenstruktur ändern, um leichter zu dem Ergebnis zu kommen (sind derzeit kaum Daten drin) ? Wie soll man solche Abstimmungen aus einem Webformular am besten speichern ?
      Danke

      Comment


      • #4
        Das mit den "gesonderten Spalten" war eigentlich nur eine Feststellung, um die Verwirrung zu nehmen, dass bei dem Beispielstatement 3 Ergebnisspalten für eine Ausgangsspalte ('item1') enthalten sind.
        Ohne den Kontext der Abstimmung bzw. der Anwendung zu kennen, kann ich keine allgemeingültige Aussage zur "besten" Datenstruktur geben. Eventuell sinnvoll: "Schulnotensystem" -> good = 1, average = 2 und bad = 3 (yes = 1, no = 0) Wenn in den Spalten Zahlen gespeichert werden (evtl. auch als SchlüsselIDs einer anderen Tabelle), können diese leichter aggregiert werden - und man kann bei der Ausgabe immer noch ein "Mapping" auf die tatsächliche Bedeutung herstellen.

        Comment


        • #5
          @Zunera, danke für deine Hilfe. Scheinbar gibt es gar keine schnellere Methode innerhalb der SQL-Engine. Ich habe nur Angst, dass diese umfangreiche Abfrage das System zu langsam macht, oder ist das nicht so schlimm? Ich habe ca. 20 SET-Anweisungen und ca. 15 Queries um ein Ergebnis für die oben abgeführte Tabelle zu erhalten. Ich möchte das dann als Stored Procedure (MS SQLExpress) realisieren.

          Comment

          Working...
          X