Oracle SQL сумма сумм

#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'