2012-04-29 11 views
8

Próbuję nauczyć się więcej na temat SQL w tej chwili i obecnie próbuję przeprowadzić proste raportowanie sprzedaży przy użyciu funkcji SUM, COUNT, AVG i GROUP BY w bazie danych SQL Server 2008. Udało mi się uzyskać sumę, liczbę i średnią dla każdej grupy według wiersza.Pierwsze Grand Totals przy użyciu grupy przez

Jak uzyskać sumę całkowitą wszystkich grup według wierszy?

SQL do tej pory:

SELECT 
    SUM(dbo.tbl_orderitems.mon_orditems_pprice) AS prodTotal, 
    AVG(dbo.tbl_orderitems.mon_orditems_pprice) AS avgPrice, 
    count(dbo.tbl_orderitems.uid_orditems_prodid) AS prodQty, 
    dbo.tbl_orderitems.txt_orditems_pname 
FROM 
    dbo.tbl_orderitems 
INNER JOIN 
    dbo.tbl_orders 
    ON (dbo.tbl_orderitems.uid_orditems_orderid = dbo.tbl_orders.uid_orders) 
WHERE 
    dbo.tbl_orders.uid_order_webid = 
     <cfqueryparam cfsqltype="cf_sql_integer" value="#session.webid#"> 
    AND dbo.tbl_orders.txt_order_status = 
     <cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.sale_status#"> 
GROUP BY 
    dbo.tbl_orderitems.txt_orditems_pname 
 
Product       Qty  Gross  Avg 

Westbury Climbing Frame   17  8,023.00  471.94 
Sandpoint Deluxe Climbing Frame 34  36,146.00 1,063.12 
Roseberry Climbing Frame   9  7,441.00  826.78 
Ridgeview Texas Climbing Frame 10  6,990.00  699 
Selwood Picnic Table    9  489.92  54.44 

I need the Totals of qty column and gross column 

Dziękujemy

Jason

+1

Czy możesz podać przykład wyjścia, którego chcesz? Nie do końca rozumiem, czym jesteś po: – Lock

+0

Spójrz na ['GROUPING SETS'] (http://technet.microsoft.com/en-us/library/bb510427 (v = sql.100) .aspx) –

+0

będzie przepraszam !! –

Odpowiedz

13

Szukasz operatora ROLLUP, który doda sumę całkowitą na końcu zestawu wyników. Jeśli szukasz bardziej złożonych łącznie sumy używać ROLLUP lub CUBE z klauzuli GROUP BY, takie jak link podany przez @MartinSmith lub Aggregation WITH ROLLUP

SELECT 
    SUM(dbo.tbl_orderitems.mon_orditems_pprice) AS prodTotal, 
    AVG(dbo.tbl_orderitems.mon_orditems_pprice) AS avgPrice, 
    count(dbo.tbl_orderitems.uid_orditems_prodid) AS prodQty, 
    dbo.tbl_orderitems.txt_orditems_pname 
FROM 
    dbo.tbl_orderitems 
INNER JOIN 
    dbo.tbl_orders ON (dbo.tbl_orderitems.uid_orditems_orderid = dbo.tbl_orders.uid_orders) 
WHERE 
    dbo.tbl_orders.uid_order_webid = <cfqueryparam cfsqltype="cf_sql_integer" value="#session.webid#"> 
    AND dbo.tbl_orders.txt_order_status = <cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.sale_status#"> 
GROUP BY 
    dbo.tbl_orderitems.txt_orditems_pname 
WITH ROLLUP 
+5

Tylko jedna uwaga: funkcje 'WITH ROLLUP' i' WITH CUBE' są przestarzałe i zaleca się ich unikać. (Zobacz sekcję * Nie zgodną z ISO * na [tej stronie podręcznika] (http://msdn.microsoft.com/en-us/library/ms177673.aspx "GROUP BY (Transact-SQL)").) może użyć 'ROLLUP()' zamiast: 'GROUP BY ROLLUP (dbo.tbl_orderitems.txt_orditems_pname)'. –

+0

który działa dobrze, a informacje na temat agregacji z rollupem od Martina Smitha są dobre dla moich kolejnych kroków - dziękuję wszystkim –

2

owinąć wybierz w inny wybierz i zsumować kolumny.

4

wiem, jest to stara sprawa, ale tylko na przyszłość - możesz także uzyskać większą kontrolę nad procesem grupowania za pomocą GROUPING SETS. Na przykład:

SELECT 
    SUM(dbo.tbl_orderitems.mon_orditems_pprice) AS prodTotal, 
    AVG(dbo.tbl_orderitems.mon_orditems_pprice) AS avgPrice, 
    count(dbo.tbl_orderitems.uid_orditems_prodid) AS prodQty, 
    COALESCE(dbo.tbl_orderitems.txt_orditems_pname, 'TOTAL') 
FROM 
    dbo.tbl_orderitems 
INNER JOIN 
    dbo.tbl_orders 
    ON (dbo.tbl_orderitems.uid_orditems_orderid = dbo.tbl_orders.uid_orders) 
WHERE 
    dbo.tbl_orders.uid_order_webid = 
     <cfqueryparam cfsqltype="cf_sql_integer" value="#session.webid#"> 
    AND dbo.tbl_orders.txt_order_status = 
     <cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.sale_status#"> 
GROUP BY GROUPING SETS (
    (dbo.tbl_orderitems.txt_orditems_pname), 
    () 
) 

ten sposób wynik będzie mieć zarówno wiersze zgrupowane przez txt_orditems_pname i bez grupowania w ogóle. Możesz określić więcej zestawów grupujących, np. zapytanie o średnią pensję w dziale i zespole, łącznie z sumami dla działu i całej firmy.

Powiązane problemy