SQL Server:如何在带有where子句的select查询中包含count?

SQL Server:如何在带有where子句的select查询中包含count?,sql,sql-server,tsql,Sql,Sql Server,Tsql,假设我有这张桌子: id out flag --- --- --- 1 0 1 1 1 0 1 4 0 2 0 1 2 2 0 2 2 0 3 0 1 3 2 0 3 1 0 3 4 0 我想计算out=(0、2或4)的行数,然后显示flag=1的行数

假设我有这张桌子:

id     out    flag
---   ---     ---
 1     0       1
 1     1       0
 1     4       0
 2     0       1
 2     2       0
 2     2       0
 3     0       1
 3     2       0
 3     1       0
 3     4       0
我想计算out=(0、2或4)的行数,然后显示flag=1的行数

基本上: 选择id,count(其中out IN(0,2,4))作为cnt,其中flag=1

我的期望输出:

 id  cnt
---  ----
 1     2
 2     3
 3     3
此查询按预期工作,但仅当我没有“where flag=1”时:

有没有一种方法可以让我先计算某物的sum()并将其存储在列中,然后使用where子句过滤掉行?目前的情况是,首先过滤掉行,然后计算总和(…)


有什么方法可以纠正这个问题吗?

您可以使用
大小写
表达式,当id的行具有指定的
out
列值时,仅对这些行求和

select id,sum(case when out in (0,2,4) then 1 else 0 end) as cnt
from tablename
group by id
编辑:要在求和时包括其他列,请使用
sum
窗口功能

select * from (select id,flag
               ,sum(case when out in (0,2,4) then 1 else 0 end) over(partition by id) as cnt
               --include other columns as required
               from tablename
              ) x 
where flag=1

0,2,4
计算出来。然后使用
内部联接
或使用相关子查询过滤它们

模式:

CREATE TABLE #TAB (ID  INT,   OUT_VALUE INT,    FLAG INT)

INSERT INTO #TAB
SELECT 1,  0, 1
UNION ALL
SELECT  1,  1, 0
UNION ALL
SELECT  1,  4, 0
UNION ALL
SELECT  2,  0, 1
UNION ALL
SELECT  2,  2, 0
UNION ALL
SELECT  2,  2, 0
UNION ALL
SELECT  3,  0, 1
UNION ALL
SELECT  3,  2, 0
UNION ALL
SELECT  3,  1, 0
UNION ALL
SELECT  3,  4, 0
UNION ALL
SELECT  4,  4, 0
现在请选择下面的选项

内部联接

SELECT T1.ID,COUNT(1) C
FROM #TAB T1
INNER JOIN 
(
        SELECT DISTINCT ID FROM #TAB WHERE FLAG = 1
)FLAGS ON T1.ID = FLAGS.ID
 WHERE T1.OUT_VALUE IN (0,2,4)
GROUP BY T1.ID
相关子查询

SELECT ID, C  FROM (
SELECT T1.ID
,COUNT(1) C
,(
        SELECT DISTINCT ID
        FROM #TAB T2
        WHERE T1.ID = T2.ID
            AND T2.FLAG = 1
        ) FLAG


FROM #TAB T1 WHERE T1.OUT_VALUE IN (0,2,4)
GROUP BY T1.ID

)A
WHERE A.FLAG IS NOT NULL
结果将是

+----+---+
| ID | C |
+----+---+
|  1 | 2 |
|  2 | 3 |
|  3 | 3 |
+----+---+

id=1的输出应该是2吗?我同意,id=1应该有一个刚刚更新的计数2!很抱歉造成混淆。请更新帖子以反映您的实际需要,或打开一个新帖子。我收到的“id在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。”错误。我的select语句中有多个列,如果将它们全部包含在GROUPBY中,这将非常复杂。是否有一种方法可以使用您的查询而不必对select语句中的每一列使用groupby?这正按预期工作!还有一件事——我的查询中还有一个where子句,它从表中过滤出结果。有没有一种方法可以先找到sum(),然后让where子句过滤行?创建另一个select查询并将其内部连接是我唯一的解决方案吗?请在问题本身中发布您的所有要求。我刚刚编辑了我的帖子。你能检查一下吗?谢谢
SELECT ID, C  FROM (
SELECT T1.ID
,COUNT(1) C
,(
        SELECT DISTINCT ID
        FROM #TAB T2
        WHERE T1.ID = T2.ID
            AND T2.FLAG = 1
        ) FLAG


FROM #TAB T1 WHERE T1.OUT_VALUE IN (0,2,4)
GROUP BY T1.ID

)A
WHERE A.FLAG IS NOT NULL
+----+---+
| ID | C |
+----+---+
|  1 | 2 |
|  2 | 3 |
|  3 | 3 |
+----+---+