2012-04-04 19 views
2

Ich wurde gebeten, eine Liste der Franchises zu erstellen, die die meisten Einnahmen nach Jahren gruppiert haben, die Order by Clause muss jedoch nach Franchiseunternehmen geordnet werden, die je nach Datumsbereich die meisten Einnahmen erzielt haben. Ich kann sie mit der einmaligen Geldstrafe bestellen, aber wie kann ich die Franchise-Gruppierungen nach Umsatz ordnen?Wie wird nach einer Datengruppe sortiert?

group by 
    vFranMasterNumRollup.MasterFranNumber, 
    REPLACE(vFranMasterNumRollup.FranchiseName, ',', '') , 
    YEAR(vremittheaderdetailandfran.remd_ServiceDate) 
order by 
    sum(vremittheaderdetailandfran.remd_LaborRevenue) desc, 
    REPLACE(vFranMasterNumRollup.FranchiseName, ',', '') 

Sie hier sehen, ich habe versucht, eine weitere Spalte für die Bestellung hinzufügen, aber ich will zusammen die höchste Franchise-Gruppe halten in der absteigenden Reihenfolge

Lassen Sie mich wissen, wenn Sie mehr Code benötigen

ist hier mehr der Codes:

SELECT  vFranMasterNumRollup.MasterFranNumber, REPLACE(vFranMasterNumRollup.FranchiseName, ',', '') AS FranchiseName, 
sum(vremittheaderdetailandfran.remd_LaborRevenue),YEAR(vremittheaderdetailandfran.remd_ServiceDate) 
FROM   vremittheaderdetailandfran INNER JOIN 
         vFranMasterNumRollup ON vremittheaderdetailandfran.remh_FranchiseNumber = vFranMasterNumRollup.fran_FranchiseID 
WHERE  (vremittheaderdetailandfran.remd_ServiceDate BETWEEN @startdate and @enddate AND (vFranMasterNumRollup.fran_Status = N'ACTIVE') OR 
         (vremittheaderdetailandfran.remd_ServiceDate BETWEEN @startdate and @enddate)) 
group by vFranMasterNumRollup.MasterFranNumber, 
REPLACE(vFranMasterNumRollup.FranchiseName, ',', '') , YEAR(vremittheaderdetailandfran.remd_ServiceDate) 
order by sum(vremittheaderdetailandfran.remd_LaborRevenue) desc,REPLACE(vFranMasterNumRollup.FranchiseName, ',', '') 
+3

können Sie einige Beispieldaten und Ihr erwartetes Ergebnis veröffentlichen? – Taryn

Antwort

0

wenn Sie Gruppe verwenden, indem Sie, müssen Sie durch eine der Spalten, um zu bestellen, die auf der Gruppierung oder einer des aggr teilnehmen egate columns (SUM beispielsweise)

Sie müssen auch nicht die vollständige Aggregationsfunktion in der Reihenfolge hinzufügen, indem Sie einfach "order by" eingeben und den Index der Spalte hinzufügen. Zum Beispiel:

select columns1, column2, sum(coulm3) 
from table1 
group by columns1, column2 
order by 3 

wird durch die Summe bestellen

+0

Hier ist mehr von meinem Code, danke für Ihren Vorschlag: –

+0

tun Sie einfach ORDER BY 3, 2 – Diego

+0

Bestellung von 3, 2 ist das gleiche wie das, was ich habe –

1

Wenn ich Sie richtig verstehe, haben Sie wahrscheinlich so etwas wie dies wollen:

ORDER BY 
    SUM(SUM(vremittheaderdetailandfran.remd_LaborRevenue)) 
    OVER (PARTITION BY vFranMasterNumRollup.MasterFranNumber), 
    REPLACE(vFranMasterNumRollup.FranchiseName, ',', '') 

Die SUM(…) OVER (…) Sache ist ein Fensteraggregatfunktion. Diese spezielle Fenster SUM() berechnet die Summen über den gesamten Bereich in Ihrer WHERE Klausel, Gruppierung (Partitionierung) sie durch vFranMasterNumRollup.MasterFranNumber (was ich verstanden, war eine Art von Franchise-Unique Identifier).

Das Argument eines gefensterten SUM() ist in der Regel eine Spalte oder ein Ausdruck, der Spaltenreferenzen enthält, genau wie bei der "normalen" SUM(). In diesem Fall können Sie ein anderes SUM() als Argument sehen. Die andere SUM() ist eine "normale" Aggregatfunktion. Wir müssen den aggregierten Wert von vremittheaderdetailandfran.remd_LaborRevenue anstelle der Spalte direkt referenzieren, da dies eine GROUP BY Abfrage ist und die fragliche Spalte nicht in der GROUP BY-Klausel enthalten ist. Als Ergebnis liest sich der gesamte Ausdruck als "Summensumme von remd_LaborRevenue", was in diesem Zusammenhang, denke ich, durchaus sinnvoll ist.

Sie können mehr über gefensterte Aggregatfunktionen im Handbuch OVER Clause (Transact-SQL) lesen.

Verwandte Themen