Sql 将三个分组的Select查询合并为一个查询 ——准时PMWO 选择位置,按OnTimePMWOs计数(WONUM) 从…起 工单 其中worktype='pm'和actfinish

Sql 将三个分组的Select查询合并为一个查询 ——准时PMWO 选择位置,按OnTimePMWOs计数(WONUM) 从…起 工单 其中worktype='pm'和actfinish,sql,sql-server,database,sql-server-2012,Sql,Sql Server,Database,Sql Server 2012,这是一个答案(可能只是基于有限问题的猜测)。我不喜欢在聚合中放置CASE语句,但根据所包含表中的环境、索引和数据,它可能会运行正常。发帖时请多参与。向我们展示您的尝试,解释问题,提供数据样本,包括所需的输出,所有有趣的东西。问题越好,得到好答案的机会就越大。好的,马上就完成 --ON TIME PMWO's SELECT LOCATION, COUNT(WONUM) AS OnTimePMWOs FROM WORKORDER WHERE worktype = 'pm' and actf

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

--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
DECLARE@forecast30天日期
SET@Forecast30days=当前时间戳+30
选择
地点
,将(wo.actfinish=wo.targcompdate然后wo.WONUM ELSE NULL END时的情况)计数为PasstDuepmWO
,将(pm.changedate不为空的情况下,则wo.WONUM ELSE为空结束)计算为预测30天
从工单作为wo
左连接PMFORECAST作为pm
在wo.changedate=pm.changedate
和pm.forecastdate>=@Forecast30days
其中wo.worktype='pm'
和((wo.actfinish不为空,wo.targcompdate不为空)
或(pm.changedate不为空))
分组
地点

什么是环境?目的是什么?什么是问题?你想要什么?问题是什么?如果你想让我们帮忙,就跟我们谈谈!谢谢,这很有效。对不起,我问的时候不够清楚。它在SQL Server中工作。您可能只需要用ISNULL包装wo.actfinish。类似于ISNULL(wo.actfinish、wo.createddate)。记住在查询中检查wo.actfinish的所有实例,以确保正确。
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