【问题标题】:Pivot Dynamic row to Column with output parameter?使用输出参数将动态行旋转到列?
【发布时间】:2015-09-24 07:31:16
【问题描述】:

在我的查询中旋转统计数据列没有问题,例如 Column 1 、 Column 2 、 Column 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

这是否可以通过微调我的代码来实现,还是我必须走另一个方向?

【问题讨论】:

    标签: sql sql-server-2012 pivot row


    【解决方案1】:

    你可以这样做:

    查询

    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
    

    【讨论】:

    • 我可以在 exec 的哪个位置设置我想为 AppPool 使用的值?
    • @Nils 你可以在下面执行它:Exec sp_test 1
    猜你喜欢
    • 2012-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-16
    • 1970-01-01
    • 2011-03-08
    相关资源
    最近更新 更多