sql - SQL Count Distinct IDs with condition
问题描述
我想进行一个查询,在其中我可以计算给定列至少具有 1 个真值的 ID 的数量,并一次对多个列执行此操作。
例如,我有一个这样的数据库:
Table1
Name col_1 col_2
A true true
A false true
B false false
C true false
C true false
Table2
Name ID
A 1
B 2
C 3
我基本上想计算有多少 ID 具有某个列为真(结果输出如下所示):
Row col_1_true col_2_true
1 2 1
对于单列,我可以这样做:
SELECT
COUNT(DISTINCT ID, col_1) as col_1_true
FROM table1, table2
WHERE table1.Name = table2.Name
col_1 = true
但是我想从单个查询中获得最终输出中所有需要的计数(因为我的实际数据集有很多列,我想定期查询),所以如下所示:
SELECT
COUNT(DISTINCT ID, col_1 = true) as col_1_true
COUNT(DISTINCT ID, col_2 = true) as col_2_true
FROM table1, table2
WHERE table1.Name = table2.Name
我尝试了多种方法,大致如下:
SUM(DISTINCT ID, CASE WHEN col_1 = true THEN 1 ELSE 0 END)
抛出和错误(函数 SUM 的参数太多),或
SELECT
SUM(
CASE WHEN col_1 = true
THEN 1 ELSE 0 END)
AS col_1_true,
SUM(
CASE WHEN col_2 = true
THEN 1 ELSE 0 END)
AS col_2_true
FROM table1, table2
WHERE table1.Name = table2.Name
GROUP BY table2.ID
哪个不提供正确的输出。它的输出是:
Row col_1_true col_2_true
1 1 1
2 0 1
3 0 0
4 1 0
5 1 0
我想我可能必须引入子查询和/或子表,但不确定如何继续。
解决方案
在 tsql 中会是这样的:
SELECT
COUNT(DISTINCT
CASE WHEN col_1 = true
THEN table2.ID END)
AS col_1_true,
COUNT(DISTINCT
CASE WHEN col_2 = true
THEN table2.ID END)
AS col_2_true
FROM table1, table2
WHERE table1.Name = table2.Name
推荐阅读
- debugging - 有没有办法在 dbx 中关联跟踪事件的操作
- r - 两个 data.frame 列之间的条件差异
- java - 从 BufferReader 获取输入
- sql-server - 如何将 INT 数据类型转换为 BIGINT 数据类型?
- arrays - adding scalar to an array in julia
- excel - 单元格中心的 Excel 复选框
- hibernate - 如何将查询结果映射到不是实体的自定义对象中?
- c# - 如何在 HTML 或 c# 中将 Excel 行拖放到网页中的文本框中
- jquery - 成功的 Ajax 调用并返回 Ok() 作为 ActionResult 后模态不关闭
- reactjs - Kendo React Bootstrap Datepicker 年份不可点击