如何以Matrix / Pivot格式显示Oracle查询输出

时间:2016-02-09 11:00:55

标签: sql oracle pivot

我想以下列查询的Matrix / Pivot格式显示输出。

查询:

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中按顺序在不同的垂直列中显示每个月。

1 个答案:

答案 0 :(得分:1)

你好这样的东西(在Oracle 11gr2上测试过)?使用Pivot功能:

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;

伊戈尔