基于组返回ID值
问题描述:
对于表t1基于组返回ID值
+----+------+
| ID | Flag |
+----+------+
| 1 | 1 |
| 1 | 0 |
| 1 | 0 |
| 2 | 0 |
| 2 | 0 |
| 2 | 0 |
| 3 | 1 |
| 3 | 1 |
| 3 | 0 |
+----+------+
我需要提取的样本子集ID的基础上以两种不同方式的标志值:
1)所有的ID没有1的中旗。
+----+
| ID |
+----+
| 2 |
+----+
2)所有ID在Flag中有多个1。
+----+
| ID |
+----+
| 3 |
+----+
尝试查询不是有用因此排除实现,这是使用的情况下的聚集
答
的一个简单方法。例如:
DECLARE @T TABLE (ID INT, Flag BIT);
INSERT @T VALUES (1, 1), (1, 0), (1, 0), (2, 0), (2, 0), (2, 0), (3, 1), (3, 1), (3, 0);
SELECT ID
FROM @T
GROUP BY ID
HAVING COUNT(CASE WHEN Flag = 1 THEN 1 END) = 0; -- No flag 1.
SELECT ID
FROM @T
GROUP BY ID
HAVING COUNT(CASE WHEN Flag = 1 THEN 1 END) > 1; -- More than one flag 1.
答
使用以下查询检查标志计数总数。
1)
SELECT id,
SUM(flag) cnt
FROM t1
GROUP BY id
HAVING SUM(flag) = 0
结果
id cnt
2 0
2)
SELECT id,
SUM(flag) cnt
FROM t1
GROUP BY id
HAVING SUM(flag) > 1
结果
id cnt
3 2
答
这是一个代码特例位,由于标志为数字和一个1或0
SELECT ID,
CASE
WHEN Ones = 0
Then 'No active flags'
When Ones > 1
Then 'Multiple Active flags'
END
FROM (
SELECT ID,
Sum(Cast(Flag as int)) as Ones
FROM t1
GROUP BY ID
) as Src
WHERE Ones != 1
答
只要你的标志是数字和只有1和0值,那么你可以使用下面的两个查询:
select ID from t1 group by ID having sum(cast(flag as int)) = 0;
和
select ID from t1 group by ID having sum(cast(flag as int)) > 1;
+0
。对于求和操作符,操作数数据类型位查询操作无效。 –
+0
将标志简单转换为int将修复该问题。我没有指定“只要你的标志是数字的”一点数据类型不是真正的数字它是一个逻辑数据类型。数字数据类型可与传统的数字操作一起使用,例如添加和扩展集合(如SUM)。 – Sentinel
请。对于求和操作符,操作数数据类型位查询操作无效。 –
是位数据类型吗? –
就是这样。感谢您指出了这一点。很高兴知道这一点不能总结。 CAST为int将使这个工作。 – AS91