2016-08-08 53 views
0

Ich habe eine komplexe Abfrage, die ich in eine temporäre Tabelle ausgegeben habe.GROUP BY mit aggregiertem SQL Server

Innerhalb dieses Datensatzes habe ich verschiedene Arten von Angeboten: Filme, COD, Funktionen, Andere.

Alle Angebote, die COD und andere sind und eine totalrev_YTD ZWISCHEN 10K und 15K haben, sollten in einer einzigen Zeile mit dem Deal-Namen als "TOTAL COD" summiert werden, ansonsten sollte es eine eigene Linie haben.

Wie würde ich das tun. Ich kann nicht scheinen GROUP BY mit SUM(totalrev_YTD) BETWEEN 10 und 15k zu tun.

Kann jemand bitte helfen:

SELECT 
    location, locationid, dealtype, 
    (CASE 
     WHEN dealtype = 'OTHER (COD, ETC)' and totalrev_YTD BETWEEN 10000 AND 15000 
      THEN 'OTHER (COD, ETC)' 
     ELSE deal 
    END) as deal, 
    rental_PW, rental_MTD, rental_QTD, rental_YTD, 
    sales_PW, sales_MTD, sales_QTD, sales_YTD, 
    otherrev_PW, otherrev_MTD, otherrev_QTD, otherrev_YTD, 
    totalrev_PW, totalrev_MTD, totalrev_QTD, totalrev_YTD 
FROM 
    #temp_rev t1 
WHERE 
    dealtype = 'OTHER (COD, ETC)' 
GROUP BY 
    (CASE 
     WHEN dealtype = 'OTHER (COD, ETC)' and totalrev_YTD BETWEEN 10000 AND 15000 
      THEN 'OTHER (COD, ETC)' 
     ELSE deal 
    END), 
    location, locationid, dealtype, 
    rental_PW, rental_MTD, rental_QTD, rental_YTD, 
    sales_PW, sales_MTD, sales_QTD, sales_YTD, 
    otherrev_PW, otherrev_MTD, otherrev_QTD, otherrev_YTD, 
    totalrev_PW, totalrev_MTD, totalrev_QTD, totalrev_YTD 

Ein Beispiel hierfür 10 COD, andere Angebote wäre ich habe. Wo 1 des Geschäfts eine totalrev_YTD> 15K hat. In diesem Fall sollte das mit einer eigenen Zeile erscheinen und das andere sollte nur aggregiert werden.

+0

Hier ist ein großartiger Ort zu starten. http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/ –

+0

Wenn Sie sagen, Sie können nicht, erhalten Sie einen Fehler? Die Verwendung von case-Anweisung in group by ist gültig, Sie haben jedoch in der ursprünglichen Spalte dealtype in der Gruppe nach belassen und auswählen. Die selbe Groß-/Kleinschreibung sollte in select sein. Auch bei all diesen Spalten versammeln Sie wahrscheinlich nicht das, was Sie wirklich wollen. – Matt

Antwort

0

Ich denke, Ihre GROUP BY ist gut, Sie brauchen es nur auf weniger Spalten zu sein, und dann aggregieren Sie (mit SUM) alle Zahlen, die, gut, summiert werden sollten.

In den Fällen, in denen es sich um einen "einzeiligen" Deal handelt, addiert die Abfrage nur diese eine Zeile, was völlig in Ordnung ist.

Beispiel:

SELECT location, locationid, dealtype 
, (CASE WHEN dealtype = 'OTHER (COD, ETC)' and totalrev_YTD BETWEEN 10000 AND 15000 THEN 'OTHER (COD, ETC)' 
    ELSE deal 
    END 
) as deal, 
sum(rental_PW) as rental_PW, 
sum(rental_MTD) as rental_MTD, 
..., -- insert other summed columns here 
sum(totalrev_YTD) as totalrev_YTD 

FROM #temp_rev t1 
WHERE dealtype ='OTHER (COD, ETC)' 

GROUP BY 
(CASE WHEN dealtype = 'OTHER (COD, ETC)' and totalrev_YTD BETWEEN 10000 AND 15000 THEN 'OTHER (COD, ETC)' 
    ELSE deal 
    END 
) , 
location, locationid, dealtype 
+0

Scheint nicht zu funktionieren. Es sollte nur 2 Zeilen zurückgeben. Ein Deal, der totalrev_YTD> 15K hat und eine weitere Zeile mit der Summe von allem anderen. Aber es gibt 150 Zeilen für jeden Deal ... – a415

+0

@ a415 Sie sagten, wenn dealtype ist "ANDERE (COD, ETC)" und YTD zwischen 10K und 15K dann summieren, und "andere weise sollte es eine eigene Linie haben". Also, 1 Zeile für alle Angebote, die Sie zusammenlegen, und was ist das Gruppierungskriterium für die verbleibenden Zeilen? Ich nahm 1 Reihe pro Standort/Locationid/Dealtype/Deal-Kombination. Wollen Sie sagen, Sie wollen 1 zusammenfassende Zeile für die gegebenen Kriterien und 1 Zeile für alles andere, für insgesamt 2 Zeilen? Vielleicht verstehe ich das falsch ... – SlimsGhost