首页 > 解决方案 > 动态 Where 与动态 Group by

问题描述

我试图有一个查询,@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

我得到错误:

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

我发现有人在这里尝试做类似的事情

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

EXCEC (@query + @where + @groupby)

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

还有其他选择吗?

标签: sqlsql-server

解决方案


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

GROUP BY 

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

推荐阅读