#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