Sql 使用动态分组方式的动态位置

Sql 使用动态分组方式的动态位置,sql,sql-server,Sql,Sql Server,我正在尝试一个查询,如果给定一个@gived_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

我正在尝试一个查询,如果给定一个
@gived_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
它工作得非常好,但是当我尝试向GROUPBY语句添加更多列时:

.
.
.
GROUP BY 

    CASE  @given_case 
        WHEN 'branch' THEN fk_branch, fk_staff
        WHEN 'department' THEN fk_department, fk_staff
END
我得到一个错误:

味精102,第15级,状态1,第65行
“,”附近的语法不正确

我发现有人想做类似的事情

他们所做的是将
where
groupby
子句存储在字符串中,然后运行

EXCEC (@query + @where + @groupby)
这个解决方案似乎有效,但我不想这样做,因为我认为查询可能变得难以维护


还有其他选项吗?

case语句只能返回单个列/值,不能返回元组。不过,由于您的两个分组都有
fk_员工
,所以您可以简单地执行此操作

分组依据
案例@给定案例
当“分支”时,则为fk_分支
当“部门”时,则为fk_部门
完,fk_工作人员

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

GROUP BY (CASE @given_case WHEN 'branch' THEN fk_branch END)
         (CASE @given_case WHEN 'department' THEN fk_department END),
         fk_staff
原因是
CASE
表达式返回一个表达式——具有一个类型。表达式的类型是在编译查询时确定的——您可能会发现添加新列会导致类型转换错误

对于单独的
大小写
表达式,没有问题。每个表达式对应一个列。

不仅是一个较难维护的
exec(@query+@where+@groupby)
,它也是动态SQL,这使得您的代码容易受到SQL注入的攻击。您需要将逗号放在case语句之后,而不是放在里面。