通过分组集进行Hirearchial动态分组

时间:2016-06-13 05:09:43

标签: sql sql-server sql-server-2008

我正在尝试使用sql

中的分组集制作一份租用报告

用户将要分组的列作为逗号分隔参数传递给存储过程

例如:如果用户需要按国家/地区分组,则按地区分组,然后按deptno分组 他将作为参数发送,例如:

@grouplist='Country,Region,DeptNo'

要分组的列将是动态的。它将作为参数发送到存储过程。我不能使用ssrs报告。这是我用来生成报告的查询

    --select Country,region,Deptno , Count(EmpNo) EmpCount, 
--Sum(Sal) Total, GROUPING_ID(Country, region,Deptno) AS GrpLevel  
--from emp 
--group by GROUPING SETS(( Country,region,Deptno),(Country,Region),(Country) ,()) having country is not null

DECLARE @sql NVARCHAR(MAX) = N'select '+@grouplist +' , Count(EmpNo) EmpCount, 
 Sum(Sal) Total, GROUPING_ID(' + @grouplist + ') AS GrpLevel  
 from emp 
 group by GROUPING SETS( ' +@MC +'   ,()) having country is not null 
 order by ' + @grouplist

 -- Select @sql

EXEC sp_executesql @sql; 

我得到的输出如下

Current Output

需要实际输出

Actual Output Needed

是否有任何选项可以将单个列中的列显示为输出。问题是逐个列的列将作为存储过程的参数。 任何帮助表示赞赏。

样本数据如下

Sample data

1 个答案:

答案 0 :(得分:0)

只是尝试编写一个外部查询:我将您的sql语句视为内部查询。

将#temp作为

选择'india'作为国家,NULL作为Region,CAST(NULL AS VARCHAR)作为deptno ,5为empcount,7875为Grptotal

UNION ALL

选择'india'作为国家,'Karnataka'作为Region,CAST(NULL AS VARCHAR)作为deptno ,3为人数,5475为Grptotal

UNION ALL

选择'india'作为国家,'Karnataka'作为地区,CAST(20 AS VARCHAR)作为deptno ,1为empcount,2975为Grptotal

UNION ALL

选择'india'作为国家,'Karnataka'作为地区,CAST(30 AS VARCHAR)作为deptno ,2为empcount,2500为Grptotal

选择

COALESCE(X.deptno,X.Region,X.country)AS grpby,X.empcount,X.Grptotal

SELECT NULL AS country,NULL AS Region,NULL AS deptno

)AS DUMMY

交叉申请

选择

国家,地区,DEPTNO,empcount,Grptotal

来自#temp

)X

此处交叉申请是动态选择国家,地区,deptno

如果您有任何查询,请告诉我