关于我的查询代码的使用和位置的问题

问题描述 投票:0回答:2
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子句中。

sql-server
2个回答
1
投票

旧式连接的一个最大问题是您将连接条件与查询的过滤逻辑混合在一起,因为您将它们都放在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)


0
投票

我知道了。这是解决方案:

                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
© www.soinside.com 2019 - 2024. All rights reserved.