使用输出参数将动态行旋转到列?
Pivot Dynamic row to Column with output parameter?
我在查询中转换统计列没有问题,例如第 1 列、第 2 列、第 3 列....等等。
但我想改为动态执行此操作。
我的数据是这样的:
我希望能够执行存储过程以获得输出结果:
Exec sp_output 1(来自另一个 window,其中“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
我在查询中转换统计列没有问题,例如第 1 列、第 2 列、第 3 列....等等。
但我想改为动态执行此操作。
我的数据是这样的:
我希望能够执行存储过程以获得输出结果: Exec sp_output 1(来自另一个 window,其中“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