2011-04-19 34 views
5

我有一個報告,顯示客戶訂購產品,它們的價格一起:行插入到一個查詢結果(總和)

CompanyA Product 7 14.99 
CompanyA Product 3 45.95 
CompanyA Product 4 12.00 
CompanyB Product 3 45.95 
CompanyC Product 7 14.99 
CompanyC Product 3 45.95 

我想插入總結每家公司的順序排成一列,像這樣:

CompanyA Product 7 14.99 
CompanyA Product 3 45.95 
CompanyA Product 4 12.00 
       Total: 72.94 
CompanyB Product 3 45.95 
       Total: 45.95 
CompanyC Product 7 14.99 
CompanyC Product 3 45.95 
       Total: 60.94 

下面是一些代碼,顯示查詢的基本結構,我有:

SELECT company 
    , product 
    , price 
FROM companyMaster 
ORDER BY company, 
    , product, 
    , price; 

有人知道如何做到這一點?我正在寫Transact-SQL(Microsoft SQL Server)。

回答

3

感謝大家的反饋/幫助,至少讓我想到了不同的方法。我想出了一些不依賴於我使用的SQL Server版本的東西(我們的供應商常常更改版本,所以我必須儘可能地跨越兼容)。

這可能被視爲一個黑客(好吧,這是一個黑客),但它的工作原理,以及它能夠完成任務:

SELECT company 
    , product 
    , price 
FROM companyMaster 
ORDER BY company, 
    , product, 
    , price 

UNION 

SELECT company + 'Total' 
    , '' 
    , SUM(price) 
FROM companyMaster 
GROUP BY company 

ORDER BY company; 

該解決方案基本上採用兩個SELECT語句的UNION。第一個和原來的一樣,第二個產生我需要的總和線。爲了正確定位總和線,我在公司名稱上附加了一個字符串連接(附加單詞'Total'),以便當我按公司名稱按字母順序排序時,Total行將顯示在每個公司部分的底部。

下面是最終報告的樣子(不正是我想要的,但在功能上等同,只是不太漂亮看:

CompanyA Product 7 14.99 
CompanyA Product 3 45.95 
CompanyA Product 4 12.00 
CompanyA Total   72.94 
CompanyB Product 3 45.95 
CompanyB Total   45.95 
CompanyC Product 7 14.99 
CompanyC Product 3 45.95 
CompanyC Total   60.94 
+0

不錯的「黑客」,效果很好 – Jared 2014-11-25 20:21:05

4
SELECT company, 
     product, 
     SUM(price) 
FROM companyMaster 
GROUP BY 
     company, ROLLUP(product) 
+0

當我嘗試這在查詢分析器中,我發現了以下錯誤(只是爲了澄清,我正在使用T-SQL):服務器:消息195,級別15,狀態10,行59 'ROLLUP'不是一個公認的內置函數名稱 – dvanaria 2011-04-19 17:31:02

+0

在線看,似乎COMPUTE函數可能與我正在使用的T-SQL版本向後兼容。ROLLUP僅支持Server 2005及更高版本。 – dvanaria 2011-04-19 17:35:10

+0

@dvanaria - 您需要指定您正在使用的版本,然後。 – JNK 2011-04-19 18:18:22

2

由於您使用的是SQL Server 2005,因此您需要使用rollup

-- cte for test data 
;with companyMaster(company, product, price) as 
(select 'CompanyA', 'Product 7', 14.99 union all 
select 'CompanyA', 'Product 3', 45.95 union all 
select 'CompanyA', 'Product 4', 12.00 union all 
select 'CompanyB', 'Product 3', 45.95 union all 
select 'CompanyC', 'Product 7', 14.99 union all 
select 'CompanyC', 'Product 3', 45.95 
) 

select 
    company, 
    case when grouping(product) = 0 
    then product 
    else 'Total:' 
    end, 
    sum(price) 
from companyMaster 
group by company, product with rollup 
having grouping(company) = 0 
相關問題