【问题标题】:How to write "Having" condition inside a SQL Pivot query?如何在 SQL Pivot 查询中编写“有”条件?
【发布时间】:2021-06-21 22:07:12
【问题描述】:
select * from
(
SELECT datename( Month,soh.OrderDate)[Month], sd.OrderQty as orderQty
from Sales.SalesOrderHeader soh
join Sales.SalesOrderDetail sd
on soh.SalesOrderID = sd.SalesOrderID
)t
pivot(
sum(orderQty)
for [month] in ([january],[february],[march],[april],[may],[june],[july],[august],[september],[october],[november],[december]) )as pivot_table

此查询根据月份给出 TotalOrderQuantity,但我必须按条件过滤: SUM(sd.OrderQty)>50

我没有 Pivoting 的查询是这样的:

    SELECT datename( Month,soh.OrderDate)[Month], SUM(sd.OrderQty) as orderQty
    from Sales.SalesOrderHeader soh
    join Sales.SalesOrderDetail sd
    on soh.SalesOrderID = sd.SalesOrderID
    group by datename( Month,soh.OrderDate)
    having SUM(sd.OrderQty)>50

【问题讨论】:

  • 您的查询有什么问题?

标签: sql sql-server tsql pivot case


【解决方案1】:

在 pivot 中使用正确的查询:-

select * from
(
SELECT datename( Month,soh.OrderDate)[Month], SUM(sd.OrderQty) as orderQty
from Sales.SalesOrderHeader soh
join Sales.SalesOrderDetail sd
on soh.SalesOrderID = sd.SalesOrderID
group by datename( Month,soh.OrderDate)
having SUM(sd.OrderQty)>50
)t
pivot(
sum(orderQty)
for [month] in ([january],[february],[march],[april],[may],[june],[july],[august], 
[september],[october],[november],[december]) )as pivot_table

【讨论】:

  • 谢谢,很有帮助。我在枢轴后使用别名时犯了一个错误,即 sum(orderQty)。
  • @Anu 如果答案正确,则标记为正确,这对其他人有帮助。
【解决方案2】:

使用条件聚合:

select sum(case when month(soh.OrderDate) = 1 then sd.OrderQty end) as jan,
       sum(case when month(soh.OrderDate) = 2 then sd.OrderQty end) as feb,
       . . .
       sum(case when month(soh.OrderDate) = 12 then sd.OrderQty end) as dec
from Sales.SalesOrderHeader soh join
     Sales.SalesOrderDetail sd
     on soh.SalesOrderID = sd.SalesOrderID
having sum(sd.OrderQty) > 50;

我强烈怀疑您希望结果集中有多个行,在这种情况下,您将有一个明确的GROUP BY

select <something>
       sum(case when month(soh.OrderDate) = 1 then sd.OrderQty end) as jan,
       sum(case when month(soh.OrderDate) = 2 then sd.OrderQty end) as feb,
       . . .  -- fill in the other months here
       sum(case when month(soh.OrderDate) = 12 then sd.OrderQty end) as dec
from Sales.SalesOrderHeader soh join
     Sales.SalesOrderDetail sd
     on soh.SalesOrderID = sd.SalesOrderID
group by <something>
having sum(sd.OrderQty) > 50;

【讨论】:

  • 在您提到的查询中,HAVING 不起作用,它没有过滤 SUM(OrderQty) >50,是的,我知道如果我们有 GroupBy,我们会得到多行。由于我必须过滤,我正在使用它。获得一行并使用具有条件的替代解决方案是什么?请告诉我!
  • @Anu 。 . . HAVING 应该在没有 GROUP BY 的情况下工作。如果某一行不满足条件,则查询不返回任何行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-29
  • 2016-04-17
  • 1970-01-01
  • 2016-07-09
  • 2014-03-29
  • 1970-01-01
相关资源
最近更新 更多