2009-05-27 2 views
2

Ich glaube nicht, dass das möglich ist, aber ich würde gerne anders bewiesen werden.MySQL - Feldwert nur in der ersten Instanz jedes gruppierten Wertes anzeigen?

Ich habe eine einfache Berichtsklasse geschrieben, um die Ergebnisse verschiedener Datenbankabfragen auszugeben. Um die Anzeige zu verbessern, wenn ich einen Bericht mit gruppierten Daten habe, möchte ich den Feldwert nur in der ersten Zeile jedes eindeutigen Werts anzeigen - und das würde ich gerne auf Abfrageebene tun, oder würde es tun erfordern zusätzliche Logik in meiner Klasse, um diese speziellen Werte zu bestimmen.

Es wird wahrscheinlich helfen, meine Anforderungen an einem einfachen Beispiel zu veranschaulichen. Stellen Sie sich vor diesen Datensatz:

Year Quarter Total 
2008 Q1   20 
2008 Q2   25 
2008 Q3   35 
2008 Q4   40 
2009 Q1   15 
2009 Q2   20 
2009 Q3   30 
2009 Q4   35 

Wenn möglich, möchte ich der Datensatz zurückgegeben, wie:

Year Quarter Total 
2008 Q1   20 
     Q2   25 
     Q3   35 
     Q4   40 
2009 Q1   15 
     Q2   20 
     Q3   30 
     Q4   35 

Gibt es eine Möglichkeit, dies zu tun progammatically in MySQL?

Antwort

7
SELECT CASE WHEN @r = year THEN NULL ELSE year END AS year, 
     quarter, 
     total, 
     @r := year 
FROM (
     SELECT @r := 0 
     ) vars, 
     mytable 
ORDER BY 
     year 

@r hier ist ein Session-Variable. Sie können diese in MySQL wie jede Variable in einer prozeduralen Sprache verwenden.

Zuerst wird es innerhalb der Unterabfrage auf Null initialisiert.

Zweitens ist es in der SELECT Klausel überprüft. Wenn der aktuelle Wert @r ungleich year ist, wird der ausgegeben, andernfalls wird NULL ausgegeben.

Drittens ist es mit dem aktuellen Wert von aktualisiert.

+1

+1 obwohl dies etwas besser im Bericht Client getan ist: P – Andomar

+0

+1 für eine funktionierende Lösung, die jedoch einen erheblichen Aufwand erfordert - mehr als die Funktionalität in meiner Klasse zu handhaben. Ich denke, was ich tun werde, hängt einen Wert an den Spaltennamen an, um meine Klasse zu kennzeichnen, um die Daten in einer bestimmten Weise anzuzeigen. Zum Beispiel "Year__FirstGroup". – BrynJ

+0

@BrynJ: wie @Andomar sagt, das ist natürlich besser am Client gemacht, aber ich verstehe nicht wirklich, was meinst du mit "Anstrengung zu pflegen". Diese Abfrage bricht nicht ab, wenn sie einmal geschrieben wurde, es gibt hier nichts zu warten :) – Quassnoi

4

Warum möchten Sie das tun? Was ist mit vorhandenen Datensätzen, bei denen die Spalte Jahr leer oder null ist?

Verschönerung der Ausgabe gehört in die Berichtslogik. Im Pseudocode wäre es etw. wie:

var lastYear = 0 
foreach (record in records) 
{ 
    if (record.Year == lastYear) 
    { 
    print " " 
    } 
    else 
    { 
    print record.Year 
    lastYear = record.Year 
    } 

    // print the other columns 
} 
+0

Ja, ich verstehe, was Sie sagen - ich suche nur nach der einfachsten Methode zur Implementierung/Wartung. Wenn es in MySql eine solche Lösung gäbe, vielleicht in Form einer Funktion wie GROUP_CONCAT usw., dann wäre das eine einfache, wartbare Lösung. – BrynJ

+0

Ich denke, was ich tun werde, ist eine bestimmte Zeichenfolge an die Spaltennamen (auf der Abfrageebene), die ich so gruppiert möchte. Zum Beispiel: SELECT YEAR (Datum) AS 'Year__FirstGroup', MONTH (Datum) AS Month, SUM (was auch immer) AS Total FROM meine Tabelle GROUP BY Jahr, Monat – BrynJ

1

nicht die Antwort, die Sie gefragt, aber ...

wie eine zweifelhafte Sache klingt in erster Linie zu tun in MySQL werden. Betrachtet man nur die rohen Datenreihen, scheinen die Q2s von 2008 und 2009 als Datenzeilen wenig Sinn zu ergeben. Das Problem besteht in der Präsentation, nicht im Abrufen von Daten. Hört sich eher an, als ob etwas in Ihre Darstellungsklasse geschrieben werden müsste - wenn es beispielsweise an einen bestimmten Parameter übergeben wird, weiß es, dass es Dinge wie "2008" nicht wiederholen soll.

Dies ermöglicht auch eine größere Wiederverwendbarkeit von Code: anstatt die Abfrage neu zu schreiben, wenn Sie die Daten anders darstellen möchten, z. B. nach Quartalen anstatt Jahr, können Sie einfach eines der Argumente der Darstellungsklasse ändern dass die gleiche Abfrage mit einer anderen Reihenfolge Klausel ausgeben kann:

Quarter Year Total 
Q1  2008 20 
      2009 15 
Q2  2008 25 
      2009 20 
... 
+0

Ich schätze, dass es aus Datensicht nicht viel Sinn macht - Ich habe nur gehofft, dass es eine einfache Möglichkeit gibt, dies in mysql mit einer eingebauten Funktion zu tun, genauso wie Sie GROUP_CONCAT usw. haben. – BrynJ

1

Es ist nicht genau zu Ihrer Anfrage passen, aber ich würde lieber meinen Tisch schwenken.Es ermöglicht eine visuelle Zahlen aus den 2 Jahren vergleichen, wie Sie ein Viertel pro Spalte:

SELECT Year, 
     SUM(IF(Quarter="Q1", Rev, 0)) AS Q1, 
     SUM(IF(Quarter="Q2", Rev, 0)) AS Q2, 
     SUM(IF(Quarter="Q3", Rev, 0)) AS Q3, 
     SUM(IF(Quarter="Q4", Rev, 0)) AS Q4 
FROM t1 GROUP BY 1 
ORDER BY 1 

Sie haben dann:

YEAR Q1 Q2 Q3 Q4 
2008 
2009 
Verwandte Themen