我正在尝试查询一个给定@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的事情
他们正在做的是将where
和group by
子句存储在字符串中,然后运行
EXCEC (@query + @where + @groupby)
此解决方案似乎有效,但是我不想这样做,因为我认为查询可能变得难以维护。
还有其他选择吗?
答案 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
表达式,没有问题。每个表达式对应一个列。