SQL подсчитывает различные идентификаторы с условием

#sql

#sql

Вопрос:

Я хотел бы создать запрос, в котором я мог бы подсчитать количество идентификаторов, которые имеют по крайней мере 1 истинное значение для данного столбца, и сделать это для нескольких столбцов одновременно.

Например, у меня есть база данных, подобная этой:

 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
  

По сути, я хотел бы подсчитать, сколько идентификаторов имеют определенный столбец true (результирующий вывод выглядит следующим образом):

 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. Ваш SUM(CASE WHEN) метод верен до тех пор, пока вы используете правильный синтаксис. Это называется » условная агрегация «.

2. Какую СУБД вы используете?

3. Совет сегодняшнего дня: переключитесь на современный, явный JOIN синтаксис. Проще записывать (без ошибок), легче читать (и поддерживать) и легче преобразовывать во внешнее соединение, если это необходимо.

4. типы данных col_1 и col_2?

Ответ №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