首页 > 解决方案 > 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

我想我可能必须引入子查询和/或子表,但不确定如何继续。

标签: sql

解决方案


在 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

推荐阅读