SQL Select 语句的组合

问题描述 投票:0回答:1

我正在尝试拍摄数据库中某些表的状态的“快照”。我已经完成了其中的一些,目前正在处理最后一个,但是对于最后一个,我需要查询两个不同的表。

到目前为止已经尝试过以下方法:

SELECT
     COUNT(Name) AS CRIT,
     branch
FROM
    (SELECT
         A.Name,
         A.branch,
         B.score,
         B.last_found
     FROM  
         TableA AS A
     INNER JOIN 
         TableB AS B ON A.Name = V.Name
     WHERE
         B.state <> 'DONE'
         AND DATEDIFF(day, B.last_found, GETDATE()) > 30
         AND CAST(B.score AS float) > 8) AS X
     GROUP BY
         branch

这将返回我所需要的一部分:

(https://i.stack.imgur.com/fGIgo.png)

我可以稍微修改一下代码:

SELECT
     COUNT(Name) AS LOW,
     branch
FROM
    (SELECT
         A.Name,
         A.branch,
         B.score,
         B.last_found
     FROM   
         TableA AS A
     INNER JOIN 
         TableB AS B ON A.Name = V.Name
     WHERE
         B.state <> 'DONE'
         AND DATEDIFF(day, B.last_found, GETDATE()) > 30
         AND CAST(B.score AS float) < 4) AS X
     GROUP BY
         branch

要获得以下内容:

(https://i.stack.imgur.com/PILiX.png)

这又是我需要的另一部分。最终输出应该是上述两个查询的组合,并且应该有 3 列:

CRIT   LOW   Branch  

如果我不清楚,请原谅并感谢您的帮助!!

sql-server ssms inner-join union
1个回答
2
投票

您需要条件聚合(聚合函数内的

CASE
表达式):

SELECT
   a.branch,
   COUNT(CASE WHEN CAST(b.score as float) > 8 THEN 1 END) AS crit,
   COUNT(CASE WHEN CAST(b.score as float) < 4 THEN 1 END) AS low
FROM tablea AS a
INNER JOIN tableb AS b ON b.name = a.name
WHERE b.state <> 'DONE'
AND DATEDIFF(day, b.last_found, GETDATE()) > 30
GROUP BY a.branch;
© www.soinside.com 2019 - 2024. All rights reserved.