在MS SQL中根据另一列的聚合值检索行

时间:2017-07-05 13:18:22

标签: sql sql-server

我正在尝试为MS SQL Server编写一个查询,该查询返回数量为0的container_parent_id

Container_id | Container_name | container_parent_id | quantity | alive
----------------------------------------------------------------------
1            | ContA          | 12345               | 2        | 1
2            | ContB          | 12345               | 1        | 1
3            | ContC          | 12345               | 0        | 1
4            | ContD          | 12345               | 1        | 1
5            | ContA          | 23456               | 1        | 1
6            | ContB          | 23456               | 0        | 1
7            | ContC          | 23456               | 1        | 1
8            | ContD          | 34567               | 0        | 1
9            | ContE          | 34567               | 0        | 1

在上述数据中,只应为34567返回 ContD ContE

如果我按container_parent_id分组并使用WHERE quanity = 0,则结果会包含其他行。

这就是我一直在尝试的:

SELECT count(), container_parent_id from Container where quantity = 0 GROUP BY container_parent_id HAVING count() > 0

导致:

3 | ContC | 12345 | 0 | 1 
6 | ContB | 23456 | 0 | 1 
8 | ContD | 34567 | 0 | 1 
9 | ContE | 34567 | 0 | 1

运行此查询或Renu / Stan建议的问题是,它将那些数量为0的容器作为子集返回。但是,我不希望前两个,因为他们有相同container_parent_id的数量为1或2的其他容器。我的最终输出应该是:

8 | ContD | 34567 | 0 | 1 
9 | ContE | 34567 | 0 | 1

即。每个container_parent_id只有数量为0的记录。

3 个答案:

答案 0 :(得分:2)

这样的事情应该有效:

SELECT * 
FROM Containers
WHERE 
    container_parent_id IN (
        SELECT container_parent_id 
        FROM Containers 
        GROUP BY container_parent_id 
        HAVING sum(quantity) = 0
      );

首先选择总共0个数量的所有父ID,然后将其用作嵌套查询,以获取具有这些ID作为父项的所有容器名称。

答案 1 :(得分:1)

SELECT T.*
FROM Container  t
    INNER JOIN (      
            SELECT container_parent_id,SUM(quantity) Tot
            FROM Container   
            GROUP BY container_parent_id) g ON T.container_parent_id = G.container_parent_id
WHERE G.Tot=0

答案 2 :(得分:-1)

只需尝试一下,

SELECT container_parent_id FROM Container WHERE quantity=0