【问题标题】:PIVOT columns in SQL Server with their SUMSQL Server 中的 PIVOT 列及其 SUM
【发布时间】:2015-06-22 09:03:20
【问题描述】:

参考我之前的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 美元。我想把最终报告做成这样。

目前,我正在使用这样的东西:SUM(CASE WHEN ord_PurchaseType = 'cash' THEN prod_Price ELSE 0 END) 来获取数据,当我不在SET @query = N' ... 查询中运行时,它可以工作。除此之外,它有一个错误,说它有一个名为 cash 的无效列。我也尝试将 cash 这个词放在 variable 中,但它仍然会产生相同的错误。

【问题讨论】:

  • 你有一些数据可以参考吗?
  • @HJK 我有来自Here的样本数据
  • 我可以看到您给出的示例中的任何现金数据。你的产品桌上有现金吗?

标签: sql sql-server tsql pivot


【解决方案1】:

好的,这个更具挑战性,但建立在我们上一个答案的基础上。与您在此处要做的不同之处本质上是将 2 个不同的值聚合到同一个报告中。将产品数量和现金支付相加。您不能在单个数据透视语句中完成所有操作,但您可以分别执行这些操作,然后将它们组合在一起。

见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'

【讨论】:

  • 感谢@sarin,我设法用它创建了大部分报告。
  • 很高兴。有任何问题,请告诉我。
  • 已经很久了,但是有没有办法将您的查询用于视图?
  • 很遗憾,您不能在视图或 UDF 中使用动态 sql,除非最近发生了变化。
  • 检查你声明@sql的数据类型。如果还有其他内容,请尝试 varchar(max)。
【解决方案2】:

试试这个。

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

How do I escape a single quote in SQL Server?

【讨论】:

    猜你喜欢
    • 2016-09-03
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    • 2019-06-03
    相关资源
    最近更新 更多