将动态行转换为具有输出参数的列?

编程入门 行业动态 更新时间:2024-10-25 22:23:59
本文介绍了将动态行转换为具有输出参数的列?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我在查询中旋转统计列没有问题,例如列1,列2,列3 ...等.

但是我想做的是动态的.

我的数据如下:

我希望能够执行存储过程以获取输出结果: Exec sp_output 1 (从另一个窗口,其中"1"代表PoolID(@AppPool))看起来像这样:

这是我的SP:

create PROCEDURE [dbo].[sp_test] @Query as nvarchar(100) -- OUTPUT?, @AppPool AS nvarchar(50) AS SELECT @Query = Attribute FROM [dbo].[Vy_UserAccess] WHERE PoolID = @AppPool SELECT [Users],'+ @Query +' FROM (SELECT [Pool],[Users],[RecNum],[Attribute],[Values] FROM [dbo].[Vy_UserAccess] ) AS T1 PIVOT (MAX([Values]) FOR [ATTRIBUTE] IN ('+ @Query +')) AS T2

是否可以通过微调代码来实现?还是我必须朝另一个方向发展?

解决方案

您可以在以下位置进行操作:

查询

CREATE PROCEDURE [dbo].[sp_test] @AppPool AS NVARCHAR(60) AS DECLARE @cols AS NVARCHAR(MAX) = '', @sql AS NVARCHAR(MAX) SELECT @cols += QUOTENAME([Name]) + ',' FROM (SELECT DISTINCT Attribute as Name FROM [dbo].[Vy_UserAccess] WHERE PoolID = @AppPool ) a ORDER BY Name DESC SET @cols = LEFT(@cols, LEN(@cols) - 1) SET @sql = 'SELECT Users, ' + @cols + ' FROM ( SELECT [Pool],[Users],[RecNum],[Attribute],[Values] FROM [dbo].[Vy_UserAccess] ) AS T1 PIVOT (MAX([Values]) FOR [ATTRIBUTE] IN ('+ @cols +')) AS T2' EXEC sp_executesql @sql, N'@AppPool NVARCHAR(60)', @AppPool

执行

Exec sp_test 1

查询示例数据

CREATE PROCEDURE sp_test @AppPool AS NVARCHAR(60) AS CREATE TABLE #test ( PoolId NVARCHAR(60), Pool NVARCHAR(40), Users NVARCHAR(60), RecNum INT, Attribute NVARCHAR(40), [Values] NVARCHAR(20) ) INSERT INTO #test VALUES ('1', 'FINANCE', 'User1', 2, 'DIVISION', '010'), ('1', 'FINANCE', 'User1', 1, 'COMPANY', '1'), ('1', 'FINANCE', 'User1', 1, 'DIVISION', '050') DECLARE @cols AS NVARCHAR(MAX) = '', @sql AS NVARCHAR(MAX) SELECT @cols += QUOTENAME([Name]) + ',' FROM (SELECT DISTINCT Attribute as Name FROM #test WHERE PoolID = @AppPool ) a ORDER BY Name DESC SET @cols = LEFT(@cols, LEN(@cols) - 1) SET @sql = 'SELECT Users, ' + @cols + ' FROM ( SELECT [Pool],[Users],[RecNum],[Attribute],[Values] FROM #test ) AS T1 PIVOT (MAX([Values]) FOR [ATTRIBUTE] IN ('+ @cols +')) AS T2' EXEC Sp_executesql @sql, N'@AppPool NVARCHAR(60)', @AppPool DROP TABLE #test

输出

Users DIVISION COMPANY User1 050 1 User1 010 NULL

There is no problem for me to pivot statistic columns in my query e.g Column 1 , Column 2 , Column 3.... and so on.

But i would like to do this dynamic instead.

My data looks like this:

i want to be able to EXECUTE a store procedure to get the output result: Exec sp_output 1 (from another window where '1' represents the PoolID (@AppPool)) to look like this:

This is my SP:

create PROCEDURE [dbo].[sp_test] @Query as nvarchar(100) -- OUTPUT?, @AppPool AS nvarchar(50) AS SELECT @Query = Attribute FROM [dbo].[Vy_UserAccess] WHERE PoolID = @AppPool SELECT [Users],'+ @Query +' FROM (SELECT [Pool],[Users],[RecNum],[Attribute],[Values] FROM [dbo].[Vy_UserAccess] ) AS T1 PIVOT (MAX([Values]) FOR [ATTRIBUTE] IN ('+ @Query +')) AS T2

Is this possible to achieve by just fine tuning my code or do i have to go on another direction?

解决方案

You can do It in following:

QUERY

CREATE PROCEDURE [dbo].[sp_test] @AppPool AS NVARCHAR(60) AS DECLARE @cols AS NVARCHAR(MAX) = '', @sql AS NVARCHAR(MAX) SELECT @cols += QUOTENAME([Name]) + ',' FROM (SELECT DISTINCT Attribute as Name FROM [dbo].[Vy_UserAccess] WHERE PoolID = @AppPool ) a ORDER BY Name DESC SET @cols = LEFT(@cols, LEN(@cols) - 1) SET @sql = 'SELECT Users, ' + @cols + ' FROM ( SELECT [Pool],[Users],[RecNum],[Attribute],[Values] FROM [dbo].[Vy_UserAccess] ) AS T1 PIVOT (MAX([Values]) FOR [ATTRIBUTE] IN ('+ @cols +')) AS T2' EXEC sp_executesql @sql, N'@AppPool NVARCHAR(60)', @AppPool

EXECUTION

Exec sp_test 1

QUERY WITH SAMPLE DATA

CREATE PROCEDURE sp_test @AppPool AS NVARCHAR(60) AS CREATE TABLE #test ( PoolId NVARCHAR(60), Pool NVARCHAR(40), Users NVARCHAR(60), RecNum INT, Attribute NVARCHAR(40), [Values] NVARCHAR(20) ) INSERT INTO #test VALUES ('1', 'FINANCE', 'User1', 2, 'DIVISION', '010'), ('1', 'FINANCE', 'User1', 1, 'COMPANY', '1'), ('1', 'FINANCE', 'User1', 1, 'DIVISION', '050') DECLARE @cols AS NVARCHAR(MAX) = '', @sql AS NVARCHAR(MAX) SELECT @cols += QUOTENAME([Name]) + ',' FROM (SELECT DISTINCT Attribute as Name FROM #test WHERE PoolID = @AppPool ) a ORDER BY Name DESC SET @cols = LEFT(@cols, LEN(@cols) - 1) SET @sql = 'SELECT Users, ' + @cols + ' FROM ( SELECT [Pool],[Users],[RecNum],[Attribute],[Values] FROM #test ) AS T1 PIVOT (MAX([Values]) FOR [ATTRIBUTE] IN ('+ @cols +')) AS T2' EXEC Sp_executesql @sql, N'@AppPool NVARCHAR(60)', @AppPool DROP TABLE #test

OUTPUT

Users DIVISION COMPANY User1 050 1 User1 010 NULL

更多推荐

将动态行转换为具有输出参数的列?

本文发布于:2023-07-10 08:21:23,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1089820.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:转换为   参数   动态

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!