группировать в случае вложенных случаев с условиями на разных таблицах - PullRequest
0 голосов
/ 04 сентября 2018

Мой вопрос немного похож на этот вопрос, но с оговоркой. В моем случае условия зависят от разных таблиц, а не от одной таблицы. Часть, которая доставляет мне неприятности, это часть GROUP BY. Вот запрос:

SELECT
    CASE 
        WHEN T1.ImportantColumn = 'Y'
        THEN 'Good'
        ELSE
            CASE
                WHEN T2.ImportantColumn = 1
                THEN 'Very Good'
                ELSE
                    CASE
                        WHEN T3.ImportantColumn IS NULL
                        THEN 'Bad'
                        ELSE T3.ImportantColumn
                    END
            END
    END AS WorkStatus,   
    SUM(case when T2.sex = 'M' THEN 1 ELSE 0 END) male , 
    SUM(case when T2.sex = 'F' THEN 1 ELSE 0 END) female , 
    COUNT(WorkStatus) AS [CountWorkStatus] 
FROM 
    Condition1Table T1 
    RIGHT JOIN Condition2Table T2 ON T1.city = T2.Code_id AND T1.field_name = 'cities' 
    INNER JOIN Condition3Table T3 ON T2.student_id = T3.student_id
GROUP BY T3.ImportantColumn, T2.ImportantColumn, T1.ImportantColumn -- <-- wrote this but I know it's wrong

Это своего рода сценарий IF ELSE. Если Condition1Table.ImportantColumn равно 'Y', то 'Хорошо', иначе, если Condition2Table.ImportantColumn равно 1, тогда 'Очень хорошо', иначе, если Condition3Table.ImportantColumn равно NULL, затем 'bad', иначе значение в Condition3Table.ImportantColumn . Сложной частью является группировка данных в желаемом формате, который указан ниже:

WorkStatus | male | female | CountWorkStatus
----------   -----  ------   ---------------
Good       |  3   |   7    | 10
Very Good  | 11   |   2    | 13
Bad        |  5   |   0    | 5
Val1       |  1   |   9    | 10
Val2       | 41   |   23   | 64

1 Ответ

0 голосов
/ 04 сентября 2018

Вы, кажется, спрашиваете, "как мне сгруппировать по огромному оператору CASE без повторения всего оператора CASE"?

Если это так, просто используйте подзапрос.

Тогда у результата оператора CASE есть имя столбца, к которому вы можете обратиться.

Здесь почти нулевое снижение производительности, подзапросы расширяются как макросы. SQL - это декларативный язык, это всего лишь синтаксис для выражения решаемой проблемы. Когда это скомпилировано, есть программа для запуска. Поэтому, думая о SQL, вам просто нужен синтаксис для выражения вашей проблемы.

SELECT
    WorkStatus,
    SUM(case when sex = 'M' THEN 1 ELSE 0 END) male , 
    SUM(case when sex = 'F' THEN 1 ELSE 0 END) female , 
    COUNT(WorkStatus) AS [CountWorkStatus] 
FROM
(
    SELECT
        CASE 
            WHEN T1.ImportantColumn = 'Y'
            THEN 'Good'
            ELSE
                CASE
                    WHEN T2.ImportantColumn = 1
                    THEN 'Very Good'
                    ELSE
                        CASE
                            WHEN T3.ImportantColumn IS NULL
                            THEN 'Bad'
                            ELSE T3.ImportantColumn
                        END
                END
        END AS WorkStatus,
        T2.sex
    FROM 
        Condition1Table T1 
        RIGHT JOIN Condition2Table T2 ON T1.city = T2.Code_id AND T1.field_name = 'cities' 
        INNER JOIN Condition3Table T3 ON T2.student_id = T3.student_id
)
  AS StatusBySex
GROUP BY
  WorkStatus
...