pivot的用法

"PIVOT"关系运算符 一般用来解决‘行转列’的需求,比如常用于按周,月汇总数据。

用一个按月份汇总薪资的列子来看

需求:

有一张有员工,时间,薪资的数据表,需要按月份汇总员工当月每天的薪资到一行展示,结果图如下

月份员工号1号工资2号工资...30号工资31号工资
       

数据结构:

create table ABCS
(
  UPDATE_DATE           DATE not null,
  EMPOLYEE_NAME     NVARCHAR2(80),
  SALARY                       NUMBER
)

数据如下分别是6月1号和6月2号的工资

时间员工工资

时间

 

员工工资
20200701张三1220200601张三12
20200701李四1020200601李四10
20200702张三1120200602张三11
20200702李四2020200602李四20
20200701张三2020200601张三20
      

INSERT INTO ABCS VALUES (2020/7/1,    张三,    12);
INSERT INTO ABCS VALUES (2020/7/2,    张三,    11);
INSERT INTO ABCS VALUES (2020/7/2,    李四,    20);
INSERT INTO ABCS VALUES (2020/7/1,    张三,    20);
INSERT INTO ABCS VALUES (2020/7/1,    张三,    20);
INSERT INTO ABCS VALUES (2020/6/1,    张三,    12);
INSERT INTO ABCS VALUES (2020/6/1,    李四,    10);
INSERT INTO ABCS VALUES (2020/6/2,    张三,    11);
INSERT INTO ABCS VALUES (2020/6/2,    李四,    20);
INSERT INTO ABCS VALUES (2020/6/1,    张三,    20);

>>>>>>>>不用PIVOT函数:根据每天先拆分薪资,再汇总<<<<<<<<

SQL如下

SELECT UI.NAME AS 姓名,
       UI.MONTH AS 月份,
       SUM(UI.ONE) AS 一号薪资, 
       SUM(UI.TWO) AS 二号薪资
  FROM (
        SELECT DISTINCT AB.EMPOLYEE_NAME AS NAME,
                         TO_CHAR(AB.UPDATE_DATE, 'MM') AS MONTH,
                         DECODE(TO_CHAR(AB.UPDATE_DATE, 'dd'),
                                1,
                                nvl(AB.SALARY, 0)) AS ONE,
                         DECODE(TO_CHAR(AB.UPDATE_DATE, 'dd'),
                                2,
                                nvl(AB.SALARY, 0)) AS TWO
        
          FROM ABCS AB
         GROUP BY AB.EMPOLYEE_NAME, AB.UPDATE_DATE, AB.SALARY
         ) UI
 group by UI.NAME, UI.MONTH

运行结果:

>>>>>>>>用pivot方式后<<<<<<<<

SQL如下:

SELECT UI.NAME AS 姓名,
       UI.MONTH AS 月份,
       NVL(UI.一号, 0) AS 一号薪资,
       NVL(UI.二号, 0) AS 二号薪资
  FROM (SELECT AB.EMPOLYEE_NAME AS NAME,
               TO_CHAR(AB.UPDATE_DATE, 'MM') AS MONTH,
               TO_CHAR(AB.UPDATE_DATE, 'dd') DAY,
               AB.SALARY
          FROM ABCS AB) T PIVOT(SUM(T.SALARY) FOR DAY IN('01' AS 一号,
                                                         '02' AS 二号)) UI

运行结果:

 

参考:

http://technet.microsoft.com/zh-cn/library/ms177410(v=sql.105).aspx

总结:

1,查除基础数据表格,确定以那一列汇总,那一列为根据

2,  添加PIVOT :SUM聚合函数中放入汇总字段(SALARY),FOR 后面 添加 根据字段(DAY),其中SUM函数可以是其他计算函数

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值