Oracle中的PIVOT表

时间:2016-06-10 08:43:52

标签: oracle

您能否帮助我在我的Oracle表格中透视细分 PAY_DETAILS

PAY_NO                                    NOT NULL NUMBER
EMP_NO                                    NOT NULL VARCHAR2(10)
EMP_ERN_DDCT_NO                           NOT NULL VARCHAR2(21)
ERN_DDCT_CATNO                            NOT NULL VARCHAR2(10)
ERN_DDCT_CATNAME                          NOT NULL VARCHAR2(1000)
PAY_MONTH                                 NOT NULL DATE
AMOUNT                                    NOT NULL NUMBER(10,2)
EARN_DEDUCT                               NOT NULL VARCHAR2(2)

 select EMP_NO,EMP_ERN_DDCT_NO,AMOUNT,EARN_DEDUCT, ERN_DDCT_CATNO from   pay_details 

EMP_NO     EMP_ERN_DDCT_NO           AMOUNT EA ERN_DDCT_C
---------- --------------------- ---------- -- ----------
219        10                           175 A  001
219        1                           5000 A  002
794        7                          50000 A  001
769        6                          35000 A  001
465        4                           5000 A  002
289        2                           5000 A  002
435        3                           5000 A  002
816        38                             5 D  201
737        30                             5 D  201

是否可以将此输出变为交叉表?

1 个答案:

答案 0 :(得分:0)

因此,假设您想要透过每个月的工资数据。您可以使用以下查询。

SELECT * FROM
(
  SELECT emp_no, 
         emp_ern_ddct_no, 
         pay_month, 
         amount
  FROM   pay_details
)
PIVOT
(
  SUM(amount)
  FOR pay_month IN ('01/01/2016', '02/01/2016', '03/01/2016','04/01/2016','05/01/2016','06/01/2016','07/01/2016','08/01/2016','09/01/2016','10/01/2016','11/01/2016','12/01/2016')
)
ORDER BY emp_no;

这只是一个示例,您可以根据不同的列隐藏数据。有关更多详细信息,请参阅以下链接。

http://www.techonthenet.com/oracle/pivot.php

http://www.oracle-developer.net/display.php?id=506

因为你使用Oracle 10g PIVOT不会工作。尝试使用类似于以下查询的内容。

SELECT emp_no,
  SUM(CASE WHEN pay_month ='01/01/2016' THEN AMOUNT ELSE 0 END) jan_pay,
  SUM(CASE WHEN pay_month ='02/01/2016' THEN AMOUNT ELSE 0 END) feb_pay,
  SUM(CASE WHEN pay_month ='03/01/2016' THEN AMOUNT ELSE 0 END) march_pay
  .........
FROM pay_details
GROUP BY emp_no;