2012-04-29 43 views
8

Hiện tại tôi đang cố gắng thực hiện một số báo cáo bán hàng đơn giản bằng cách sử dụng các hàm SUM, COUNT, AVGGROUP BY trong cơ sở dữ liệu SQL Server 2008. Tôi đã quản lý để có được tổng số, đếm và trung bình của mỗi nhóm theo hàng.Bắt Grand Total bằng Group By

Làm cách nào để có tổng số lượng lớn tất cả các nhóm theo hàng?

SQL cho đến nay:

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 

Rất cám ơn

Jason

+1

Bạn có thể đưa ra ví dụ về đầu ra bạn muốn không? Tôi không hoàn toàn hiểu rõ những gì bạn đang có sau khi – Lock

+0

Nhìn vào ['GROUPING SETS'] (http://technet.microsoft.com/en-us/library/bb510427 (v = sql.100) .aspx) –

+0

sẽ xin lỗi !! –

Trả lời

13

Bạn đang tìm kiếm toán tử ROLLUP để thêm hàng tổng cộng vào cuối tập hợp kết quả. Nếu bạn đang tìm kiếm tổng số tổng hợp phức tạp hơn sử dụng ROLLUP hoặc CUBE với mệnh đề GROUP BY, chẳng hạn như liên kết được cung cấp bởi @MartinSmith hoặc 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

Chỉ cần một lưu ý: Các tính năng 'WITH ROLLUP' và' WITH CUBE' không được chấp nhận và nên tránh. (Xem phần * Cú pháp tuân thủ không theo tiêu chuẩn ISO * của [trang hướng dẫn này] (http://msdn.microsoft.com/en-us/library/ms177673.aspx "GROUP BY (Transact-SQL)").) Bạn có thể sử dụng 'ROLLUP()' thay vào đó: 'GROUP BY ROLLUP (dbo.tbl_orderitems.txt_orditems_pname)'. –

+0

hoạt động tốt và thông tin về tổng hợp với rollup từ smith martin, rất tốt cho các bước tiếp theo của tôi - cảm ơn tất cả các bạn –

2

Quấn chọn của bạn trong lựa chọn khác và tổng hợp các cột.

4

Tôi biết đây là một câu hỏi cũ, nhưng chỉ để tham khảo trong tương lai - bạn cũng có thể giành quyền kiểm soát nhiều hơn đối với quá trình nhóm bằng cách sử dụng NHÓM NHÓM. Ví dụ:

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), 
    () 
) 

Bằng cách này kết quả sẽ có cả hai hàng được nhóm theo txt_orditems_pname và không có nhóm nào cả. Bạn có thể chỉ định nhiều nhóm nhóm hơn, ví dụ: một truy vấn cho mức lương trung bình trong một bộ phận và nhóm, với tổng số cho bộ phận và toàn bộ công ty cũng trở lại.