SQL Server中的透视列及其总和

SQL Server中的透视列及其总和,sql,sql-server,tsql,pivot,Sql,Sql Server,Tsql,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) 订单表 prod_ID - int prod_Name - va

关于我以前的经历。 对于表中的这些更改:(*)用于标记表中的更改

产品表

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)
订单表

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(当ord\u PurchaseType='cash'然后prod\u Price ELSE 0 END时)
获取数据,当我运行在非
SET@query=N'内部时,它会起作用……
query。除此之外,它还有一个错误,即它有一个名为现金的无效列。我还尝试将单词cash放入变量中,但它仍然会产生相同的错误。

试试这个

SUM(CASE WHEN ord_PurchaseType = ''cash'' ....
试试这个

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

好的,这个问题有点挑战性,但以我们上一个答案为基础。这里要做的不同之处在于将两个不同的值聚合到同一个报告中。将产品数量和现金付款相加。不能在一个pivot语句中完成所有操作,但可以单独完成,然后将它们连接在一起

在这里,您可以看到顶部的原始透视图,它被包装在一个名为ProductQuantilities的公共表表达式(CTE)中。然后,我们为付款添加了一个新的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'

好吧,这一个更具挑战性,但基于我们上一个答案。这里要做的不同之处在于将两个不同的值聚合到同一个报告中。将产品数量和现金付款相加。不能在一个pivot语句中完成所有操作,但可以单独完成,然后将它们连接在一起

在这里,您可以看到顶部的原始透视图,它被包装在一个名为ProductQuantilities的公共表表达式(CTE)中。然后,我们为付款添加了一个新的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'

你有一些数据可供参考吗?@HJK我有来自我的示例数据,我看到了你的示例中的任何现金数据。您的产品表中有现金吗?您有一些数据可供参考吗?@HJK我有来自i的样本数据,请查看您示例中的现金数据。你的产品表上有现金吗?谢谢@sarin,我用它制作了我的大部分报告。很高兴。有任何问题,请告诉我。已经很久了,但是有没有办法将查询用于视图?很遗憾,除非最近情况发生了变化,否则无法在视图或UDF中使用动态sql。请检查您声明的数据类型@sql。如果还有其他内容,请尝试varchar(max)。谢谢@sarin,我用它创建了我的大部分报告。很高兴。有任何问题,请告诉我。已经很久了,但是有没有办法将查询用于视图?很遗憾,除非最近情况发生了变化,否则无法在视图或UDF中使用动态sql。请检查您声明的数据类型@sql。如果还有其他问题,请尝试使用varchar(max)。