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语句之后,而不是放在里面。