带条件的SQL计数唯一ID

时间:2019-03-13 20:04:05

标签: sql

我想进行一个查询,在该查询中我可以计算给定列的具有至少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为true的列有多少个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

我认为我可能必须引入子查询和/或子表,但是不确定如何进行。

1 个答案:

答案 0 :(得分:1)

在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