2016-02-09 48 views
0

我想以下列查詢的Matrix/Pivot格式顯示輸出。如何在Matrix/Pivot格式中顯示Oracle查詢輸出

查詢:

SELECT 
    SUBSTR(mon, 4, 6) month, 
    rmbs_cd, 
    scdta, 
    cl_nm, 
    br_cd, 
    brd_nm, 
    prod, 
    prod_nm, 
    SUM(sale_net)  sales 
FROM (SELECT 
     LAST_DAY(x.deli_dt)         mon, 
     x.rmbs_cd, 
     x.sc_cd || x.dist_cd || x.tha_cd || x.un_cd || x.cl_id scdta, 
     INITCAP(cl_nm)           cl_nm, 
     a.br_cd, 
     brd_nm, 
     a.cat_cd || a.prd_cd         prod, 
     prod_nm, 
     sale_cd, 
     Nvl(sum(a.sale_net) - sum(rt_qty * flat_rt), 0)  sale_net 
     FROM bill_det a, bill_mas x, cl_info c, inv_brand d, inv_prod p 
     WHERE (a.bill_no = x.bill_no AND a.sc_cd = x.sc_cd) 
      AND x.fl_mvh IN ('1', '4') 
      AND x.deli_dt BETWEEN '01-JUL-15' AND '31-DEC-15' 
      AND a.br_cd = d.br_cd AND d.div_cd = '1' 
      AND a.typ_cd || a.cat_cd || a.prd_cd = p.typ_cd || p.cat_cd || p.prd_cd 
      AND p.typ_cd = '09' 
      AND x.sc_cd = c.sc_cd (+) 
      AND x.dist_cd = c.dist_cd (+) 
      AND x.tha_cd = c.tha_cd (+) 
      AND x.un_cd = c.un_cd (+) 
      AND x.cl_id = c.cl_id (+) 
      AND c.div_cd IN ('1', '4') 
      AND sale_cd IN ('IM', 'IC', 'IN') 
      AND cancl IS NULL 
     GROUP BY 
     LAST_DAY(x.deli_dt), 
     x.rmbs_cd, 
     x.sc_cd || x.dist_cd || x.tha_cd || x.un_cd || x.cl_id, 
     cl_nm, 
     a.br_cd, 
     brd_nm, 
     a.cat_cd || a.prd_cd, 
     prod_nm, 
     sale_cd 
) 
GROUP BY SUBSTR(mon, 4, 6), rmbs_cd, scdta, cl_nm, br_cd, brd_nm, prod, prod_nm 
ORDER BY 1, 2, 3 

結果:

mat

預期輸出:

expected

我想在Oracle中按順序在不同垂直列中顯示每個月。

+2

你會發現一些建議[這裏](https://oracle-base.com/articles/11g/pivot-and-unpivot-operators-11gr1)。理解是否有最大月數或者可以是無限的:在旋轉的時候,你必須事先知道你在旋轉之後的列數(或者建立一些動態的SQL) – Aleksej

+1

某些時候我遇到'動態pivoting',看看這裏:https://community.oracle.com/thread/883038 –

+0

謝謝你的答覆。我解決了查詢 – Iftekhar

回答

1


這樣的事情(在Oracle 11gr2上測試過)?使用旋轉功能:

 
WITH T AS(SELECT 'A' AS PROD, 1 AS VAL, 1 AS myMONTH FROM DUAL 
UNION ALL 
SELECT 'A' AS PROD, 20 AS VAL, 2 AS myMONTH FROM DUAL 
UNION ALL 
SELECT 'A' AS PROD, 33 AS VAL, 3 AS myMONTH FROM DUAL 
UNION ALL 
SELECT 'A' AS PROD, 13 AS VAL, 4 AS myMONTH FROM DUAL 
UNION ALL 
SELECT 'B' AS PROD, 3211 AS VAL, 5 AS myMONTH FROM DUAL 
UNION ALL 
SELECT 'C' AS PROD, 1 AS VAL, 6 AS myMONTH FROM DUAL 
UNION ALL 
SELECT 'D' AS PROD, 1 AS VAL, 7 AS myMONTH FROM DUAL 
UNION ALL 
SELECT 'D' AS PROD, 32 AS VAL, 7 AS myMONTH FROM DUAL 
UNION ALL 
SELECT 'E' AS PROD, 1 AS VAL, 8 AS myMONTH FROM DUAL 
UNION ALL 
SELECT 'B' AS PROD, 1 AS VAL, 9 AS myMONTH FROM DUAL 
UNION ALL 
SELECT 'G' AS PROD, 2131 AS VAL, 9 AS myMONTH FROM DUAL 
UNION ALL 
SELECT 'A' AS PROD, 1 AS VAL, 10 AS myMONTH FROM DUAL 
UNION ALL 
SELECT 'H' AS PROD, 1 AS VAL, 11 AS myMONTH FROM DUAL 
UNION ALL 
SELECT 'J' AS PROD, 234 AS VAL, 1 AS myMONTH FROM DUAL 
UNION ALL 
SELECT 'J' AS PROD, 432 AS VAL, 3 AS myMONTH FROM DUAL 
UNION ALL 
SELECT 'J' AS PROD, 22 AS VAL, 5 AS myMONTH FROM DUAL 
UNION ALL 
SELECT 'J' AS PROD, 25546 AS VAL, 5 AS myMONTH FROM DUAL) 
SELECT * 
FROM (
SELECT PROD, VAL, MYMONTH 
FROM T) 
PIVOT(SUM(VAL) FOR MYMONTH IN (1 AS JAN, 2 AS FEB, 3 AS MAR, 4 AS APR, 5 AS MAY, 6 AS JUN, 
7 AS JUL, 8 AS AGO, 9 AS SEPT, 10 AS OCT, 11 AS NOV, 12 AS DIC) 
) 
ORDER BY 
PROD; 

伊戈爾

+0

謝謝伊戈爾的答案。我在工作中使用Oracle 10g,它doesn不支持樞軸功能 – Iftekhar

相關問題