【问题标题】:Combining multiple rows to get a single one合并多行以获得单行
【发布时间】:2021-08-27 17:12:56
【问题描述】:

源表:

----------------------------------------
| Employee Name   | department | Emp Id |
----------------------------------------
| Sam             | Sales      | 101    |
----------------------------------------
| Sam             | Finance    | 101    |
----------------------------------------
| Dirk            | marketing  | 102    |
----------------------------------------
| Dirk            | Research   | 102    |
----------------------------------------

需要输出:

------------------------------------------------------
| Employee Name   | Emp Id | department1 | department2|
------------------------------------------------------
| Sam             | 101    | Sales       | Finance    |
------------------------------------------------------
| Dirk            | 102    | marketing   | Research   |
------------------------------------------------------

您能帮我解决一下我应该使用什么函数或查询来获得上述输出吗?

【问题讨论】:

    标签: sql oracle oracle11g


    【解决方案1】:

    有两种已知的数据透视技术

    1. 通过使用条件聚合
    SELECT EmployeeName, EmpId,
           MAX(DECODE(rn,1,Department)) AS Department_1,
           MAX(DECODE(rn,2,Department)) AS Department_2
      FROM (
            SELECT t.*, 
                   ROW_NUMBER() OVER 
                   (PARTITION BY EmpId,EmployeeName ORDER BY Department) AS rn
              FROM t
           )
    GROUP BY EmployeeName, EmpId
    

    2.通过使用PIVOT子句

    SELECT *
      FROM (
            SELECT t.*, 
                   ROW_NUMBER() OVER 
                   (PARTITION BY EmpId,EmployeeName ORDER BY Department) AS rn
              FROM t
           )
     PIVOT
     (
      MAX(Department) AS Department FOR rn IN (1,2)
     ) 
    

    对于这两种情况都需要枚举旋转的部门列。为此,ROW_NUMBER() 解析函数非常适合

    Demo

    【讨论】:

    • 非常感谢@Barbaros Özhan 的解决方案
    【解决方案2】:

    如果只有两个值,可以使用max()min()

    select name, empid,
           min(department) as department1,
           nullif(max(department), min(department)) as department2
    from t
    group by name, empid;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多