sql - 动态 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 行
',' 附近的语法不正确。
我发现有人在这里尝试做类似的事情
他们正在做的是将where
和group by
子句存储在字符串中,然后运行
EXCEC (@query + @where + @groupby)
这个解决方案似乎有效,但我不想这样做,因为我认为查询可能会变得难以维护。
还有其他选择吗?
解决方案
case 语句只能返回单个列/值,而不是元组。但是,因为fk_staff
您的两个分组都很常见,所以您可以简单地执行此操作...
GROUP BY
CASE @given_case
WHEN 'branch' THEN fk_branch
WHEN 'department' THEN fk_department
END, fk_staff
推荐阅读
- algorithm - 从数组中查找每对整数的绝对差的乘积
- html - 在另一个 Angular 组件中使用时如何从组件中删除动画?
- java - notifyAll() 不唤醒线程
- java - 我应该如何在http post请求的请求有效负载中传递json数据(spring boot)
- node.js - 在 simple-git 中移动和重新添加远程 URL 后设置上游分支跟踪
- mysql - 更新查询中的转换函数问题
- python - 如何检测浅蓝色身份证并在 OpenCV 中对其进行裁剪?
- java - 为什么添加 char 时会得到不同的结果?
- react-native - 在 DrawerNavigator v.5 中重置嵌套的 StackNavigator
- c - 剥离 Buffer 数据的指针数组 (Scatter Gather List) 的前 10 个字节和后 10 个字节