【问题标题】:Combine Three Grouped Select Queries Into One将三个分组的选择查询合并为一个
【发布时间】:2018-05-10 03:48:28
【问题描述】:
--ON TIME PMWO's 

SELECT LOCATION, COUNT(WONUM) AS  OnTimePMWOs
FROM
WORKORDER
WHERE   worktype = 'pm' and actfinish<=targcompdate
GROUP BY LOCATION
--PAST DUE PMWO'S

SELECT LOCATION, COUNT(WONUM) AS PastDuePMWOs
FROM
WORKORDER
WHERE  worktype = 'pm' and actfinish>=targcompdate 
GROUP BY LOCATION

--30 DayForecast- 

SELECT W.location, COUNT(W.wonum) AS Forecast30days
from
workorder AS W
INNER JOIN PMFORECAST AS P
ON W.CHANGEDATE=P.CHANGEDATE
WHERE WORKTYPE='PM' AND P.forecastdate>= GETDATE()+30
GROUP BY LOCATION

【问题讨论】:

  • 环境如何?目的是什么?什么是问题?你想要什么?问题是什么?如果您希望我们提供帮助,请与我们联系!

标签: sql sql-server database sql-server-2012


【解决方案1】:

这是一个答案(只是基于有限问题的猜测)。我不喜欢将 CASE 语句放在聚合中,但根据环境、索引和包含表中的数据,它可能会执行得很好。发布内容时请多参与。向我们展示您的尝试,解释问题,提供数据样本,包括所需的输出,所有这些有趣的东西。问题越好,得到好答案的机会就越大。好的,马上就完成了……

DECLARE @Forecast30days DATE

SET @Forecast30days = CURRENT_TIMESTAMP + 30

SELECT
    wo.LOCATION
    ,COUNT(CASE WHEN wo.actfinish <= wo.targcompdate THEN wo.WONUM ELSE NULL END) AS OnTimePMWOs
    ,COUNT(CASE WHEN wo.actfinish >= wo.targcompdate THEN wo.WONUM ELSE NULL END) AS PastDuePMWOs
    ,COUNT(CASE WHEN pm.changedate IS NOT NULL THEN wo.WONUM ELSE NULL END) AS Forecast30days
FROM WORKORDER AS wo
LEFT JOIN PMFORECAST AS pm
    ON wo.changedate = pm.changedate
    AND pm.forecastdate >= @Forecast30days
WHERE wo.worktype = 'pm'
    AND ((wo.actfinish IS NOT NULL AND wo.targcompdate IS NOT NULL)
        OR (pm.changedate IS NOT NULL))
GROUP BY
    wo.LOCATION

【讨论】:

  • 谢谢,这行得通。抱歉,我问的时候不够清楚。它在 SQL Server 中工作。
  • 你可以只用 ISNULL 包裹 wo.actfinish。像 ISNULL(wo.actfinish,wo.createddate)。请记住检查查询中的所有 wo.actfinish 实例以确保确定。
猜你喜欢
  • 2016-07-26
  • 2022-06-13
  • 2021-06-20
  • 1970-01-01
  • 2019-04-05
  • 1970-01-01
  • 1970-01-01
  • 2019-07-11
  • 1970-01-01
相关资源
最近更新 更多