SQL輸出矩陣


數據庫環境:SQL SERVER2008R2

需求:用SQL實現如下2個圖中的矩陣。

圖1           圖2

圖1和圖2都是行列轉換的另一個變形,下面直接貼上SQL腳本。

圖1的SQL實現

/*利用系統的數字輔助表,生成1-25及每連續5個數一組的組號(從1開始)*/
WITH    x0
          AS ( SELECT   ( number - 1 ) / 5 + 1 AS cn ,
                        number AS seq
               FROM     master..spt_values
               WHERE    number <= 25
                        AND number >= 1
                        AND type = 'P'
             ),/*新增一列,按組內降序排序,及在同組內從大到小排序*/
        x1
          AS ( SELECT TOP 25
                        cn ,
                        seq ,
                        ROW_NUMBER() OVER ( ORDER BY cn, seq DESC ) dseq
               FROM     x0
               ORDER BY cn ,
                        seq
             )
    /*如果是單行號,則升序;否則,降序*/
    SELECT  MAX(CASE seq % 5
                  WHEN 1 THEN CASE cn % 2
                                WHEN 1 THEN seq
                                ELSE dseq
                              END
                END) AS A ,
            MAX(CASE seq % 5
                  WHEN 2 THEN CASE cn % 2
                                WHEN 1 THEN seq
                                ELSE dseq
                              END
                END) AS B ,
            MAX(CASE seq % 5
                  WHEN 3 THEN CASE cn % 2
                                WHEN 1 THEN seq
                                ELSE dseq
                              END
                END) AS C ,
            MAX(CASE seq % 5
                  WHEN 4 THEN CASE cn % 2
                                WHEN 1 THEN seq
                                ELSE dseq
                              END
                END) AS D ,
            MAX(CASE seq % 5
                  WHEN 0 THEN CASE cn % 2
                                WHEN 1 THEN seq
                                ELSE dseq
                              END
                END) AS E
    FROM    x1
    GROUP BY cn

圖2的SQL實現

/*利用系統的數字輔助表,生成1-25及每連續5個數一組的組號(從1開始)*/
WITH    x0
          AS ( SELECT   ( number - 1 ) / 5 + 1 AS cn ,
                        number AS seq
               FROM     master..spt_values
               WHERE    number <= 25
                        AND number >= 1
                        AND type = 'P'
             ),/*新增一列,按組內降序排序,及在同組內從大到小排序*/
        x1
          AS ( SELECT TOP 25
                        cn ,
                        seq ,
                        ROW_NUMBER() OVER ( ORDER BY cn, seq DESC ) dseq
               FROM     x0
               ORDER BY cn ,
                        seq
             ),/*按對5求余的規則新生成一個組號,根據原組號取整組的數據*/
        x2
          AS ( SELECT   seq % 5 AS sno ,
                        CASE cn
                          WHEN 1 THEN seq
                        END AS A ,
                        CASE cn
                          WHEN 2 THEN dseq
                        END AS B ,
                        CASE cn
                          WHEN 3 THEN seq
                        END AS C ,
                        CASE cn
                          WHEN 4 THEN dseq
                        END AS D ,
                        CASE cn
                          WHEN 5 THEN seq
                        END AS E
               FROM     x1
             )
    /*按新組號分組,排序*/
    SELECT  MAX(A) AS A ,
            MAX(B) AS B ,
            MAX(C) AS C ,
            MAX(D) AS D ,
            MAX(E) AS E
    FROM    x2
    GROUP BY sno
    ORDER BY A

當然,實現的方法不局限於上述2種。歡迎提出更好的解決思路。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM