动态分组依据

时间:2020-07-15 21:31:22

标签: sql sql-server

我正在尝试查询一个给定@given_case的查询,该查询将返回一个表过滤器并根据情况将信息分组。

我尝试过的是

DECLARE @given_case nvarchar(50) = 'branch'

SELECT 
    CASE  @given_case 
            WHEN 'branch' THEN fk_branch
            WHEN 'department' THEN fk_department
    END as xxx,
    CASE  @given_case 
            WHEN 'branch' THEN COUNT(fk_branch)
            WHEN 'department' THEN COUNT(fk_department)
    END as xxxx,
    
    COUNT(fk_branch)
FROM dsv_global.staff
WHERE
(
    (
        @given_case = 'branch' 
        AND email LIKE 'a%'
    )
    OR
    (
        @given_case = 'department' 
        AND email LIKE 'b%'
    )
)
GROUP BY 

    CASE  @given_case 
        WHEN 'branch' THEN fk_branch
        WHEN 'department' THEN fk_department
END

它工作得非常好,但是当我尝试将更多列添加到group by语句中时:

.
.
.
GROUP BY 

    CASE  @given_case 
        WHEN 'branch' THEN fk_branch, fk_staff
        WHEN 'department' THEN fk_department, fk_staff
END

我得到了错误:

第15层状态1的第65行,消息102
','附近的语法不正确。

我发现有人试图做类似here的事情

他们正在做的是将wheregroup by子句存储在字符串中,然后运行

EXCEC (@query + @where + @groupby)

此解决方案似乎有效,但是我不想这样做,因为我认为查询可能变得难以维护。

还有其他选择吗?

2 个答案:

答案 0 :(得分:2)

case语句只能返回单个列/值,而不能返回元组。因为fk_staff对这两个分组都是相同的,所以您可以简单地执行此操作...

GROUP BY 

    CASE  @given_case 
        WHEN 'branch' THEN fk_branch
        WHEN 'department' THEN fk_department
    END, fk_staff

答案 1 :(得分:0)

我建议您使用自己的case表达式来区分每种可能性:

GROUP BY (CASE @given_case WHEN 'branch' THEN fk_branch END)
         (CASE @given_case WHEN 'department' THEN fk_department END),
         fk_staff

原因是CASE表达式返回具有单个类型的单个表达式。表达式的类型是在编译查询时确定的-您可能会发现添加新列会导致类型转换错误。

使用单独的CASE表达式,没有问题。每个表达式对应一个列。