案例 - 在具有不同数据类型的列的分组中

时间:2014-03-04 04:09:00

标签: sql-server tsql dynamic types group-by

我想要一个动态选择要分组的列的查询。

假设我有这张表:

Sample Table

我希望看到按变量分组的结果:

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子句中。

3 个答案:

答案 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 的努力。