在SQL Server PIVOT柱与他们SUM(PIVOT columns in SQL Serv

2019-10-23 11:29发布

参考我以前的问题 。 随着这些变化在表中:(*)用于标记表中的变化。

产品表

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美元。 我希望做最后的报告是这样的。

目前,我使用的是这样的: SUM(CASE WHEN ord_PurchaseType = 'cash' THEN prod_Price ELSE 0 END)得到数据,当我在不运行的内部工作SET @query = N' ...查询。 除了它是有一个错误说,它有一个名为现金无效列。 我也试过字当头现金在一个变量 ,但它仍然会产生同样的错误。

Answer 1:

好吧,这一个是有点更有挑战性,但我们最后的答案建设。 你想在这里做什么区别基本上是聚合2个不同的值相同的报告。 总结了产品数量,也总结了现金支付。 你不能做到这一切在一个单一的枢纽语句,但你可以单独做出来,然后它们连接在一起。

请参阅SQL小提琴

所以在这里你看到我们原来的支点在已经包裹在一个公用表表达式(CTE)称为ProductQuantities顶部。 然后,我们增加了一个新的CTE为这你会发现有一个稍微不同的组通过,因为我们只有在客户的现金支付感兴趣的付款。 最后,我们加入这两个查询的结果一起对客户,让我们的最终结果集。

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'


Answer 2:

试试这个。

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

如何逃脱SQL Server中的单引号?



文章来源: PIVOT columns in SQL Server with their SUM