【问题标题】:SQL Server n Times Fixed PivotSQL Server n 次固定数据透视
【发布时间】:2016-10-17 09:08:19
【问题描述】:

因此,业务人员要求我以特定方式显示数据。 他们需要为特定值显示 X 列,如果该值不存在,则用零填充。

换句话说,我有什么:

我需要什么:

我不知道我是否应该使用枢轴或 CTE 和循环来解决此问题...您能帮帮我吗?

使用 SQL Server 2008。

【问题讨论】:

    标签: sql-server pivot rows common-table-expression


    【解决方案1】:

    您可以使用ROW_NUMBER 和条件聚合来执行此旋转

    WITH cte
         AS (SELECT RECORD_ID,
                    NUMBER,
                    Row_number() OVER(PARTITION BY RECORD_ID ORDER BY NUMBER ) AS RN
             FROM   yourtable)
    SELECT RECORD_ID,
           COALESCE(Max(CASE WHEN rn = 1 THEN NUMBER END),0) AS NUMBER01,
           COALESCE(Max(CASE WHEN rn = 2 THEN NUMBER END),0) AS NUMBER02,
           COALESCE(Max(CASE WHEN rn = 3 THEN NUMBER END),0) AS NUMBER03,
           COALESCE(Max(CASE WHEN rn = 4 THEN NUMBER END),0) AS NUMBER04,
           COALESCE(Max(CASE WHEN rn = 5 THEN NUMBER END),0) AS NUMBER05,
           ...
           COALESCE(Max(CASE WHEN rn = 10 THEN NUMBER END),0) AS NUMBER10
    FROM   CTE
    GROUP  BY RECORD_ID 
    

    动态方法

    DECLARE @x        INT = 10, -- Replace it with required of columns 
            @intr     INT = 1,
            @col_list VARCHAR(8000)='',
            @sql      VARCHAR(max)=''
    
    SET @sql = '    WITH cte
             AS (SELECT RECORD_ID,
                        NUMBER,
                        Row_number() OVER(PARTITION BY RECORD_ID ORDER BY NUMBER ) AS RN
                 FROM   yourtable)
        SELECT RECORD_ID, '
    
    
    /*nothing to worry about the below while loop it is just to frame the string*/
    WHILE @intr <= @x
      BEGIN
          SET @col_list += 'COALESCE(Max(CASE WHEN rn = ' + Cast(@intr AS VARCHAR(50)) + ' THEN NUMBER END),0) AS NUMBER' + Cast(@intr AS VARCHAR(50)) + ','
          SET @intr += 1
      END
    
    SET @col_list = LEFT(@col_list, Len(@col_list) - 1)
    SET @sql += @col_list + ' FROM   CTE
        GROUP  BY RECORD_ID '
    
    EXEC ( @sql ) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-25
      • 2015-02-20
      • 2012-02-22
      相关资源
      最近更新 更多