我想要一个动态选择要分组的列的查询。
假设我有这张表:
我希望看到按变量分组的结果:
Declare @grouBy varchar(50)
Set @grouBy = 'name' -- or 'job' or 'jobCode'
我写了一个查询:
SELECT MIN(Name), MIN(job), MIN(jobCode), MAX(salary)
FROM TempTable
GROUP BY
Name,
CASE
WHEN @grouBy = 'job' THEN job
WHEN @grouBy = 'jobCode' THEN jobCode
END
错误说:
将varchar值'programmer'转换为数据类型int时转换失败。
我的问题是这个分组中数据类型的重要性如何?
我还尝试将CASE
放在SELECT
语句中但出现以下错误:
列'....'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。
答案 0 :(得分:2)
您需要确定您在CASE
中实际合并的列的公共数据类型。
job
之类的'programmer'
值当然无法转换为int
。
然后明确地将jobCode
转换为job
的字符串数据类型。例如,如果job
的数据类型为nvarchar(50)
,请使用以下内容:
Declare @grouBy varchar(50)
Set @grouBy = 'job' -- or 'name' or 'jobCode'
Select
min(Name), min(job), min(jobCode), max(salary)
from TempTable
-- FORNOW: for quick testing/debugging
--from (
-- select 'whatever' as Name, 'a' as job, 1 as jobCode, 1000 as salary
-- union
-- select 'who cares', 'b', 2, 2000) t
Group by Name,
Case
when @grouBy = 'job' then job
when @grouBy = 'jobCode' then cast(jobCode as nvarchar(50))
End
/* FORNOW: quick testing/debugging results
(No column name) (No column name) (No column name) (No column name)
whatever a 1 1000
who cares b 2 2000
*/
答案 1 :(得分:1)
您可以使用IF子句
IF(@groupBy = 'job')
Begin
SELECT
Name, job,min(jobCode), max(salary)s
from TempTable
Group by Name,@grouBy
End
Else If(@groupBy = 'jobCode')
Begin
SELECT
Name, jobCode,min(job), max(salary)s
from TempTable
Group by Name,@grouBy
End
答案 2 :(得分:0)
在对代码进行杂耍之后,
我发现可选的“分组依据”使用具有不同数据类型的列
在这种方法中,不需要CAST()你的列。
的 1。简单示例
声明@groupBy varchar(50)
的情况
设置@groupBy ='名称' - 或'名称'或'jobCode'
选择
min(姓名),min(工作),min(jobCode),max(工资)
来自TempTable
分组由 @groupBy ='name'时的情况,然后命名为End,
当@groupBy ='job'然后作业结束时的情况,
@groupBy ='jobCode'然后jobCode结束
的 2。对于“选择子句”中的更多聚合函数,您可以这样使用。
选择
的情况
案例
当@grouBy ='姓名'然后分钟(姓名)
当@grouBy ='job'然后计数(姓名)
当@grouBy ='jobCode'然后计数(姓名)
以姓名结束
,max(薪水)作为工资
来自TempTable
分组by @groupBy ='name'时的情况,然后命名为End,
当@groupBy ='job'然后作业结束时的情况,
@groupBy ='jobCode'然后jobCode结束
感谢您 J0e3gan 和 mhasan 的努力。