对于具有不同表的条件的嵌套情况,请分组

问题描述 投票:0回答:1

我的问题有点类似于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
sql sql-server-2000
1个回答
0
投票

您似乎在问“如何在不重复整个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
© www.soinside.com 2019 - 2024. All rights reserved.