SELECT
A.DJ_NUMBER as djNo
,MAX(A.ACTION) as 'SetupStarted'
,MIN(A.ACTION_TIME) AS 'SetupStart'
,MAX(B.ACTION) as 'RunStarted'
,MAX(B.ACTION_TIME) AS 'UpTimeStart'
,MAX(C.ACTION) as 'RunEnded'
,MAX(C.ACTION_TIME) AS 'UpTimeEnd'
,FORMAT(DATEDIFF(SECOND, MAX(A.ACTION_TIME), MAX(B.ACTION_TIME))/60.0,'##.##') AS Setup
,FORMAT(DATEDIFF(SECOND, MAX(B.ACTION_TIME), (C.ACTION_TIME))/60.0, '##.##') AS UpTime
FROM
[AFL_MES2O_Interface_Data_arch] A,
[StagingDB].[dbo].[AFL_MES2O_Interface_Data_arch] B,
[StagingDB].[dbo].[AFL_MES2O_Interface_Data_arch] C
--WHERE (B.DJ_NUMBER = A.DJ_NUMBER AND MAX(B.ACTION_TIME) > Min(A.ACTION_TIME)) and (C.DJ_NUMBER = B.DJ_NUMBER AND MAX(C.ACTION_TIME) > MAX(B.ACTION_TIME))
GROUP BY
A.DJ_NUMBER
HAVING
(B.DJ_NUMBER = A.DJ_NUMBER
AND MAX(B.ACTION_TIME) > Min(A.ACTION_TIME))
AND (C.DJ_NUMBER = B.DJ_NUMBER
AND MAX(C.ACTION_TIME) > MAX(B.ACTION_TIME))
ORDER BY
SetupStart ASC, UpTimeEnd
以下是我得到的错误:
Msg 8121,Level 16,State 1,Line 15 列'StagingDB.dbo.AFL_MES2O_Interface_Data_arch.DJ_NUMBER'在HAVING子句中无效,因为它不包含在聚合函数或GROUP BY子句中。
Msg 8121,Level 16,State 1,Line 15 列'StagingDB.dbo.AFL_MES2O_Interface_Data_arch.DJ_NUMBER'在HAVING子句中无效,因为它不包含在聚合函数或GROUP BY子句中。
Msg 8121,Level 16,State 1,Line 15 列'StagingDB.dbo.AFL_MES2O_Interface_Data_arch.DJ_NUMBER'在HAVING子句中无效,因为它不包含在聚合函数或GROUP BY子句中。
旧式连接的一个最大问题是您将连接条件与查询的过滤逻辑混合在一起,因为您将它们都放在where
子句中。在这里你试图将所有这些放在where
子句中,你得到一个错误,聚合可能不会出现在where
中,但应该在having
中,你将所有条件移动到having
只是为了得到上述错误。所以要解决这个问题,请在where
子句中保留连接条件:
WHERE (B.DJ_NUMBER = A.DJ_NUMBER) and (C.DJ_NUMBER = B.DJ_NUMBER)
和having
中的聚合:
HAVING (MAX(B.ACTION_TIME) > Min(A.ACTION_TIME)) and (MAX(C.ACTION_TIME) > MAX(B.ACTION_TIME))
正如评论中其他人所建议的那样,你应该停止使用旧式连接。使用[inner join][1]
重写您的查询:
FROM
[AFL_MES2O_Interface_Data_arch] A
inner join [StagingDB].[dbo].[@AFL_MES2O_Interface_Data_arch] B on B.DJ_NUMBER = A.DJ_NUMBER
inner join [StagingDB].[dbo].[@AFL_MES2O_Interface_Data_arch] C on C.DJ_NUMBER = B.DJ_NUMBER
在这种情况下,您将不再需要where
子句,您将在having
中编写聚合,如上所示。
此外,你的UpTime
条款的select
表达式中有错误 - C.ACTION_TIME
不能像这样留下。它应该是聚合函数,如MAX(C.ACTION_TIME)
。
我知道了。这是解决方案:
SELECT
A.DJ_NUMBER AS JobNo
,MAX(A.ACTION) as SetupStarted
,MIN(A.ACTION_TIME) AS SetupStart
-- ,MAX(A.ACTION_TIME) AS 'SetupStartEnd'
,MAX(B.ACTION) as RunStarted
-- ,MIN(B.ACTION_TIME) as 'RunStarted'
,MAX(B.ACTION_TIME) AS UpTimeStart
,MAX(C.ACTION) as 'RunEnded'
-- ,MIN(C.ACTION_TIME) as 'UpTimeEndStart'
,MAX(C.ACTION_TIME) AS UpTimeEnd
,FORMAT(DATEDIFF(SECOND, MIN(A.ACTION_TIME), MAX(B.ACTION_TIME))/60.0,'##.##') AS Setup
,FORMAT(DATEDIFF(SECOND, MAX(B.ACTION_TIME), MAX(C.ACTION_TIME))/60.0,'##.##') AS UpTime
FROM
[StagingDB].[dbo].[AFL_MES2O_Interface_Data_arch] as A
INNER JOIN [StagingDB].[dbo].[AFL_MES2O_Interface_Data_arch] as B
ON (B.DJ_NUMBER = A.DJ_NUMBER AND A.ACTION_TIME IS NOT NULL) AND B.ACTION_TIME > A.ACTION_TIME
INNER JOIN [StagingDB].[dbo].[AFL_MES2O_Interface_Data_arch] as C
ON (C.DJ_NUMBER = B.DJ_NUMBER AND B.ACTION_TIME IS NOT NULL) AND C.ACTION_TIME > B.ACTION_TIME
GROUP BY A.DJ_NUMBER
--ORDER BY SetupStart ASC, UpTimeEnd ASC
--where TubeJobNo = 20738056