數據庫環境:SQL SERVER2008R2
需求:用SQL實現如下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種。歡迎提出更好的解決思路。