将三个分组选择查询合并为一个

时间:2018-05-10 03:48:28

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

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

1 个答案:

答案 0 :(得分:0)

这是一个答案(所有这些只是基于有限问题的猜测)。我不喜欢将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