#sql #oracle #sum #left-join #aggregate-functions
#sql #Oracle #сумма #левое соединение #агрегатные функции
Вопрос:
Запрос
SELECT
SUM(CASE A WHEN A = B THEN 1 ELSE 0 END) AS CASE A,
SUM(CASE B WHEN B = C THEN 1 ELSE 0 END) AS CASE B,
SUM(CASE C WHEN C = D THEN 1 ELSE 0 END) AS CASE C
FROM TABLE SAMPLE_1 S_1 LEFT JOIN SAMPLE_2 S_2 ON (S_1.ID = S_2.ID)
WHERE NUMBER = '12345'
Как мне создать столбец в конце, который возвращает сумму всех условных сумм. Приветствуется любая помощь.
Комментарии:
1. Для начала это недопустимый SQL. Здесь помогут примеры данных и желаемые результаты.
Ответ №1:
Для начала, ваш код не является допустимым SQL. Может быть, вы имели в виду:
SELECT
SUM(CASE WHEN A = B THEN 1 ELSE 0 END) AS CASE_A,
SUM(CASE WHEN B = C THEN 1 ELSE 0 END) AS CASE_B,
SUM(CASE WHEN C = D THEN 1 ELSE 0 END) AS CASE_C
FROM TABLE SAMPLE_1 S_1
LEFT JOIN SAMPLE_2 S_2 ON S_1.ID = S_2.ID
WHERE NUMBER = '12345'
Это в основном предполагает, что A
, B
и C
являются столбцами из одной из двух таблиц, участвующих в запросе. Я бы настоятельно рекомендовал квалифицировать их с помощью псевдонима таблицы, чтобы сделать это однозначным. Также это не NUMBER
зарезервированное слово в Oracle — надеюсь, это не ваше фактическое имя столбца, иначе его нужно заключить в двойные кавычки.
Теперь, если вам нужен другой столбец, который суммирует три условия, это может быть:
SELECT
SUM(CASE WHEN A = B THEN 1 ELSE 0 END) AS CASE_A,
SUM(CASE WHEN B = C THEN 1 ELSE 0 END) AS CASE_B,
SUM(CASE WHEN C = D THEN 1 ELSE 0 END) AS CASE_C,
SUM(CASE WHEN A = B OR B = C OR C = D THEN 1 ELSE 0 END) AS CASE_ABC
FROM TABLE SAMPLE_1 S_1
LEFT JOIN SAMPLE_2 S_2 ON S_1.ID = S_2.ID
WHERE NUMBER = '12345'
Это пересечение трех условий, причем это не обязательно то же самое, что сумма совпадений в каждом условии. Если это так, либо повторите выражения, либо используйте подзапрос:
SELECT t.*, CASE_A CASE_B CASE_C AS CASE_ABC
FROM (
SELECT
SUM(CASE WHEN A = B THEN 1 ELSE 0 END) AS CASE_A,
SUM(CASE WHEN B = C THEN 1 ELSE 0 END) AS CASE_B,
SUM(CASE WHEN C = D THEN 1 ELSE 0 END) AS CASE_C
FROM TABLE SAMPLE_1 S_1
LEFT JOIN SAMPLE_2 S_2 ON S_1.ID = S_2.ID
WHERE NUMBER = '12345'
) t
Ответ №2:
Вы можете просто добавить
в свой запрос следующее ( CASE
оператор также исправлен) :
SELECT
SUM(CASE WHEN A = B THEN 1 ELSE 0 END)
SUM(CASE WHEN B = C THEN 1 ELSE 0 END)
SUM(CASE WHEN C = D THEN 1 ELSE 0 END) AS sum_of_all_condition
FROM TABLE SAMPLE_1 S_1 LEFT JOIN SAMPLE_2 S_2 ON (S_1.ID = S_2.ID)
WHERE NUMBER = '12345'