SQL 服务器中的 PIVOT 列及其 SUM
PIVOT columns in SQL Server with their SUM
参考我之前的。
随着表格中的这些更改:(*) 用于标记表格中的更改。
产品Table
prod_ID - int
prod_Name - varchar(100)
prod_Code - varchar(100)
*prod_Price- float
订单Table
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' ...
查询中时它有效。除此之外,它有一个错误,说它有一个名为 cash 的无效列。我还尝试将 cash 这个词放在 variable 中,但它仍然会产生相同的错误。
试试这个。
SUM(CASE WHEN ord_PurchaseType = ''cash'' ....
How do I escape a single quote in SQL Server?
好的,这个问题更具挑战性,但建立在我们上一个答案的基础上。与您想在此处执行的操作的区别本质上是将 2 个不同的值聚合到同一个报告中。汇总产品数量并汇总现金支付。您无法在一个数据透视表语句中完成所有操作,但您可以分别进行,然后将它们连接在一起。
所以在这里您可以在顶部看到我们的原始数据透视表,它已包装在一个名为 ProductQuantities 的通用 Table 表达式 (CTE) 中。然后我们为付款添加了一个新的 CTE,您会注意到它的分组依据略有不同,因为我们只对客户的现金付款感兴趣。最后我们将两个查询的结果加入到 customer 中以获得我们的最终结果集。
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'
参考我之前的
产品Table
prod_ID - int
prod_Name - varchar(100)
prod_Code - varchar(100)
*prod_Price- float
订单Table
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' ...
查询中时它有效。除此之外,它有一个错误,说它有一个名为 cash 的无效列。我还尝试将 cash 这个词放在 variable 中,但它仍然会产生相同的错误。
试试这个。
SUM(CASE WHEN ord_PurchaseType = ''cash'' ....
How do I escape a single quote in SQL Server?
好的,这个问题更具挑战性,但建立在我们上一个答案的基础上。与您想在此处执行的操作的区别本质上是将 2 个不同的值聚合到同一个报告中。汇总产品数量并汇总现金支付。您无法在一个数据透视表语句中完成所有操作,但您可以分别进行,然后将它们连接在一起。
所以在这里您可以在顶部看到我们的原始数据透视表,它已包装在一个名为 ProductQuantities 的通用 Table 表达式 (CTE) 中。然后我们为付款添加了一个新的 CTE,您会注意到它的分组依据略有不同,因为我们只对客户的现金付款感兴趣。最后我们将两个查询的结果加入到 customer 中以获得我们的最终结果集。
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'