我正在尝试使用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;
我得到的输出如下
需要实际输出
是否有任何选项可以将单个列中的列显示为输出。问题是逐个列的列将作为存储过程的参数。 任何帮助表示赞赏。
样本数据如下
答案 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
如果您有任何查询,请告诉我