2009-02-26 4 views
0

alt text http://agricam.net/test.gifSql Gruppierung

Ich brauche eine Zeile dynamisch in SQL hinzufügen, nachdem die Marketer-Nummer mit der Überschrift „Marketer Total“ ändert, die nur die Spalte „Gesamt“ hinzufügen sollten. Zum Beispiel nach der letzten Zeile des Marketer 22 Reihe, sollte es „Marketer Total“ und dann unter der Spalte Gesamt soll 1804. Das gleiche nach der letzten Zeile der Marketer 500.

Siehe Bild bei http://agricam.net/test.gif

auftreten sollte

Aktuelle Abfrage:

wählen Marketer, SubMarketer, Grade, Total, Convert (varchar, Datum, 101) [Datum] aus Sometable wo Date> = '2009.02.25' und Datum < '2/26/2009' und Marketer in ('22', '500') Gruppe von SubMarketer, Grade, Vermarkter, Datum, Gesamt Auftrag von Marketer

Vielen Dank.

+0

Tabellen mit Struktur verwenden könnte und Aktuelle Auswahl Abfrage –

Antwort

6

siehe Using ROLLUP to aggregate data in SQL

Umsetzung:

DECLARE @SOMETABLE TABLE (SUBMARKETER INT, GRADE CHAR, MARKETER INT, 
    DATE DATETIME, TOTAL INT) 
INSERT INTO @SOMETABLE 
SELECT 1415, 'A', 22, '02/25/2009', 26 UNION 
SELECT 1415, 'B', 22, '02/25/2009', 93 UNION 
SELECT 1415, 'C', 22, '02/25/2009', 1175 UNION 
SELECT 1415, 'D', 22, '02/25/2009', 510 UNION 
SELECT 1169, 'B', 500, '02/25/2009', 1 UNION 
SELECT 1169, 'C', 500, '02/25/2009', 3 UNION 
SELECT 1393, 'C', 500, '02/25/2009', 2 UNION 
SELECT 2, 'B', 500, '02/25/2009', 5 UNION 
SELECT 2, 'C', 500, '02/25/2009', 111 UNION 
SELECT 2, 'D', 500, '02/25/2009', 18 

SELECT 
    CASE WHEN SUBMARKETER IS NULL THEN 'Marketer Total' 
    ELSE CONVERT(VARCHAR, MARKETER) END MARKETER, 
    SUBMARKETER, GRADE, TOTAL, DATE 
    FROM (
    SELECT MARKETER, SUBMARKETER, GRADE, SUM(TOTAL) AS TOTAL, 
    CONVERT(VARCHAR,DATE,101)[DATE] 
    FROM @SOMETABLE 
    WHERE DATE >= '2/25/2009' AND DATE < '2/26/2009' 
    AND MARKETER IN ('22','500') 
    GROUP BY MARKETER, SUBMARKETER, GRADE, DATE WITH ROLLUP 
)M 
WHERE M.MARKETER IS NOT NULL 
AND NOT (SUBMARKETER IS NOT NULL AND DATE IS NULL) 

Aufmerksamkeit: diese gut funktionieren, wenn Marketer, SUBMARKETER und DATE-Spalten NOT NULL sind. Wenn NULL-Werte dieser Felder in der Tabelle vorhanden sind, wird dies zu einem Problem, um nutzlose Gruppierungen herauszufiltern.

+0

ROLLUP() und PARTITION() mit der Marketer Nummer sollte Ihnen helfen. Es ist jedoch eine komplexe. Viel Glück. – achinda99

+0

Ich spielte mit dieser Idee, aber ich kann es nicht richtig machen. – egjoni

-1

Erstellen Sie einen Trigger für die Tabelle, der die Summe berechnet, wenn ein Datensatz eingefügt wird. Auf diese Weise können Sie sicherstellen, dass Sie bei jeder Bewegung in der Datenbank die neueste Gesamtsumme haben.

+0

Wenn es Millionen und Abermillionen von Zeilen gibt, könnte es eine gute Strategie sein, Trigger zu verwenden, um eine aggregierte Tabelle zu verwalten. Aber es müsste viel sein. Sie müssten auch eine Neuberechnung der Summen für Aktualisierungs- und Löschtrigger auslösen. –

+0

Ich denke, der beste Weg wäre, durch Grouping/ROLLUP zu gehen, es ist nur eine harte Zeit, es genau zu zeigen, was ich brauche. – egjoni

+0

Ich habe weder bei der Summierung noch bei der Denormalisierung ein Problem. Beide können eine gültige Methode zur Lösung des Problems sein. Wie Sie gesagt haben, kommt es wirklich darauf an. –

0

Die Antwort von Coldice ist die richtige. Sofern Sie keinen zwingenden Grund haben, aggregierte Daten in der Tabelle zu speichern, ist die Abfrage-Engine ausreichend leistungsstark, um dies für Sie zu tun. Können Sie erklären, warum Sie diese Zeile in der Tabelle benötigen? Ist es für Anzeigezwecke? Sie können die ROLLUP- Funktion die Gesamtergebnisse in einer Abfrage setzen oder Sie können eine separate Abfrage eine solche säen die Summen laufen:

SELECT marketer, SUM(total) FROM TablenameHere GROUP BY marketer 
+0

Es handelt sich um einen Bericht ... daher müssen die Daten aufgeschlüsselt dargestellt werden. – egjoni

+0

Die meisten Reporting-Engines unterstützen Gruppensummen. Welchen Report Writer verwendest du? –

+0

Ich schreibe einfach eine Abfrage in SQL. – egjoni

0

Ich glaube, Sie auch COMPUTE SUM

+0

Ich habe Ihren Vorschlag ausprobiert, aber es scheint, dass die Summe für jeden Vermarkter in separaten Resultset –

+0

zurückgegeben wurde Da der Link sagt, "COMPUTE" ist veraltet - verwenden Sie stattdessen "ROLLUP". –