SQL计数具有条件的不同ID

SQL计数具有条件的不同ID,sql,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

我想做一个查询,在这个查询中,我可以计算给定列中至少有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(结果输出如下所示):

对于单个列,我可以执行以下操作:

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的参数太多),或

它不能提供正确的输出。它的输出是:

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

在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

只要使用正确的语法,您的
SUM(CASE-WHEN)
方法就是正确的。它被称为“条件聚合”。您使用的是哪种dbms?今天的提示:切换到现代的显式
JOIN
语法。更易于写入(无错误)、更易于读取(和维护),并且在需要时更易于转换为外部联接。列1和列2数据类型?只要使用正确的语法,您的
SUM(CASE-WHEN)
方法是正确的。它被称为“条件聚合”。您使用的是哪种dbms?今天的提示:切换到现代的显式
JOIN
语法。更易于写入(无错误),更易于读取(和维护),并且在需要时更易于转换为外部联接。col_1和col_2数据类型?
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