我的问题有点类似于this问题但有一点需要注意。在我的情况下,条件取决于不同的表,而不是一个表。给我带来麻烦的部分是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',那么'Good',否则如果Condition2Table.ImportantColumn为1则为'Very Good',否则如果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
您似乎在问“如何在不重复整个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