2015-06-22 54 views
1

在參考我以前Question。 在表格中進行以下更改:(*)用於標記表格中的更改。PIVOT列與它們的和

產品表

prod_ID - int 
prod_Name - varchar(100) 
prod_Code - varchar(100) 
*prod_Price- float 

訂單表

ord_ID - int 
ord_Qty - int 
prod_ID - int 
cus_ID - float 
*ord_PurchaseType - varchar(100) 

由於所有項目的價格爲每個10美元。我想讓最終報告是這樣的。

enter image description here

目前,我使用的是這樣的:SUM(CASE WHEN ord_PurchaseType = 'cash' THEN prod_Price ELSE 0 END)得到數據,當我在不運行SET @query = N' ...查詢內部工作。除了它是有一個錯誤說,它有一個名爲現金無效列。我也試過字當頭現金變量但它仍然會產生同樣的錯誤。

+0

你有一些供參考的數據? – HJK

+0

@HJK我有從[這裏]樣品DATAS(http://stackoverflow.com/questions/30912571/joining-tables-and-left-join-as-new-columns-in-tsql/30913094?noredirect=1#評論49981685_30913094) – Chloe

+0

我可以看到您示例中的任何現金數據。你的產品桌上有現金嗎? – HJK

回答

2

好吧,這一個是有點更有挑戰性,但我們最後的答案建設。與你想在這裏做的不同之處基本上是將兩個不同的值彙總到同一個報告中。總結產品數量並總結現金支付。你不能在單一的樞軸聲明中做所有事情,但你可以單獨做它們,然後將它們結合在一起。

SQL Fiddle

所以在這裏你看到我們原來的支點在已經包裹在一個公用表表達式(CTE)稱爲ProductQuantities頂部。然後,我們爲付款添加了一個新的CTE,您將注意到它具有略微不同的Group By,因爲我們只對Customer By Cash Payments感興趣。最後,我們將兩個查詢的結果一起加入到客戶中,以獲得最終結果集。

SET @query = N'WITH ProductQuantities As (
SELECT cus_Name,'+ @colsForSelect +' 
FROM ( 
    Select cus_Name, prod_Name, SUM(ord_Qty) as sum_ord_Qty 
    from Orders o 
    inner join Customers c on c.cus_ID = o.cus_ID 
    inner join Products p on p.prod_ID = o.Prod_ID 
    GROUP BY cus_Name, prod_Name 
) p 
PIVOT (MAX([sum_ord_Qty]) FOR prod_Name IN ('+ @colsForPivot +')) 
AS pvt), 

CustomerPayments As (
Select cus_Name, SUM(Case When ord_PurchaseType = ''cash'' then p.prod_Price * o.[ord_Qty] else 0 End) as [Cash Payments] 
    from Orders o 
    inner join Customers c on c.cus_ID = o.cus_ID 
    inner join Products p on p.prod_ID = o.Prod_ID 
    GROUP BY cus_Name 
) 

Select pq.*, cp.[Cash Payments] 
FROM ProductQuantities pq 
INNER JOIN CustomerPayments cp on pq.cus_Name = cp.cus_Name' 
+0

謝謝@sarin,我設法創建了大部分我的報告。 – Chloe

+0

很高興。任何問題,讓我知道。 – sarin

+0

它已經這麼久了,但有沒有辦法將你的查詢用於視圖? – Chloe