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 |
+----+---+