SQL Server中的PIVOT列及其SUM

时间:2015-06-22 09:03:21

标签: sql sql-server tsql pivot

参考我以前的Question。 通过表中的这些更改:(*)用于标记表中的更改。

产品表

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' ...查询内部运行时,它可以正常运行。除此之外,它有一个错误,说它有一个名为 cash 的无效列。我还尝试将现金这个词放在变量中,但它仍会产生相同的错误。

2 个答案:

答案 0 :(得分:2)

好的,这个有点挑战,但建立在我们的最后答案。与您要在此处执行的操作的不同之处在于,在同一报表中基本上汇总了2个不同的值。总结产品数量并总结现金支付。你不能在一个pivot语句中完成所有操作,但是你可以单独完成它们,然后将它们连接在一起。

请参阅SQL Fiddle

所以在这里你看到顶部的原始Pivot已被包含在名为ProductQuantities的公用表表达式(CTE)中。然后我们为付款添加了一个新的CTE,您会注意到它与Group By略有不同,因为我们只对客户的现金付款感兴趣。最后,我们将两个查询的结果一起加入客户,以获得我们的最终结果集。

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'

答案 1 :(得分:-2)

试试这个。

SUM(CASE WHEN ord_PurchaseType = ''cash'' ....

How do I escape a single quote in SQL Server?