zoukankan      html  css  js  c++  java
  • oracle的行转列和列转行

    1.行转列:

    一、最初的数据:

    转换之后的数据:

    二、转换的语句:

    --统计各职位的人员在各部门的分布人数:
    SELECT T.JOB, SUM(DECODE(T.JOB, 'CLERK', 1, NULL)) AS COUNT1
    , SUM(DECODE(T.JOB, 'SALESMAN', 1, NULL)) AS COUNT2
    , SUM(DECODE(T.JOB, 'PRESIDENT', 1, NULL)) AS COUNT3
    , SUM(DECODE(T.JOB, 'MANAGER', 1, NULL)) AS COUNT4
    , SUM(DECODE(T.JOB, 'ANALYST', 1, NULL)) AS COUNT5
    FROM EMP T
    GROUP BY T.JOB;

    这样写的结果是:

    虽然与需要的结果相差不远,但是还是不行

    三、最后的写法:

    --统计各职位的人员在各部门的分布人数:

    SELECT T.JOB, (CASE WHEN T.JOB='CLERK' THEN SUM(DECODE(T.JOB, 'CLERK', 1, NULL))
    WHEN T.JOB='SALESMAN' THEN SUM(DECODE(T.JOB, 'SALESMAN', 1, NULL))
    WHEN T.JOB='PRESIDENT' THEN SUM(DECODE(T.JOB, 'PRESIDENT', 1, NULL))
    WHEN T.JOB='MANAGER' THEN SUM(DECODE(T.JOB, 'MANAGER', 1, NULL))
    ELSE SUM(DECODE(T.JOB, 'ANALYST', 1, NULL)) END) AS NUM
    FROM EMP T
    GROUP BY T.JOB

    得到的结果就是:

    总结:行转列主要使用的是group by和聚合函数(max,sum),decode函数来实现的,这是原始的写法。还有一种使用pivot的更简便的实现转换的方式。

    2.列转行

    一、最初的数据:

    最后的数据:

    二、写法

      (1)采用union all的方式实现

    --列转行,将学科变成行显示
    SELECT ID,'语文' AS COURSE, 语文 AS SCORE FROM STUDENT
    UNION ALL
    SELECT ID,'数学' AS COURSE, 数学 AS SCORE FROM STUDENT
    UNION ALL
    SELECT ID,'英语' AS COURSE, 英语 AS SCORE FROM STUDENT
    ORDER BY ID

      (2)暂无,可以使用存储过程实现

  • 相关阅读:
    Test Double
    测试金字塔
    windows 10安装 db2
    漫谈系列
    SOA 和 微服务的几篇文章
    JavaScript JQuery
    【原创】单测代码生成工具Evosuite试用
    [转载]Linux进程调度原理
    [转载]Java 应用性能调优实践
    [转载]Java进程物理内存远大于Xmx的问题分析
  • 原文地址:https://www.cnblogs.com/qadyyj/p/5599693.html
Copyright © 2011-2022 走看看