數據分級顯示並且行轉列


在emp表中數據如下

ENAME				      SAL
------------------------------ ----------
SMITH				      800
ALLEN				     1600
WARD				     1250
JONES				     2975
MARTIN				     1250
BLAKE				     2850
CLARK				     2450
SCOTT				     3000
KING				     5000
TURNER				     1500
ADAMS				     1100
JAMES				      950
FORD				     3000
MILLER				     1300

要求將工資前3名爲1級工資,次3名爲2級工資,剩餘的爲3級工資,分別顯示爲一列 

最後顯示後的結果應爲

---------------     ---------------     ---------------
KING(5000)	    BLAKE(2850)	    TURNER(1500)
FORD(3000)	    CLARK(2450)	    MILLER(1300)
SCOTT(3000)	    ALLEN(1600)	    WARD(1250)
JONES(2975)			    MARTIN(1250)
				    ADAMS(1100)
				    JAMES(950)
				    SMITH(800)


sql語句如下

SELECT MAX(CASE
             WHEN grp = 1 THEN
              ename || '(' || sal || ')'
           END) AS lv1,
       MAX(CASE
             WHEN grp = 2 THEN
              ename || '(' || sal || ')'
           END) AS lv2,
       MAX(CASE
             WHEN grp = 3 THEN
              ename || '(' || sal || ')'
           END) AS lv3
  FROM (SELECT ename,
               sal,
               /* 生成分組依據*/
               CASE
                 WHEN rn <= 3 THEN
                  1
                 WHEN rn <= 6 THEN
                  2
                 ELSE
                  3
               END AS grp,
               /*生成分組的序列*/
               row_number() over(PARTITION BY(CASE
                 WHEN rn <= 3 THEN
                  1
                 WHEN rn <= 6 THEN
                  2
                 ELSE
                  3
               END) ORDER BY sal DESC) AS rn
          FROM (SELECT ename, sal,
                       /* 使用dense_rank生成序列號,並列的重複顯示 */
                       dense_rank() over(ORDER BY sal DESC) rn
                  FROM emp))
 GROUP BY rn
 ORDER BY rn
 /
 
 SQL> col lv1 for a15;
SQL> col lv2 for a15;
SQL> col lv3 for a15;
SQL> /

LV1		    LV2		        LV3
---------------     ---------------     ---------------
KING(5000)	    BLAKE(2850)	        TURNER(1500)
FORD(3000)	    CLARK(2450)	        MILLER(1300)
SCOTT(3000)	    ALLEN(1600)	        WARD(1250)
JONES(2975)			        MARTIN(1250)
				        ADAMS(1100)
				        JAMES(950)
				        SMITH(800)

7 rows selected.


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章