【问题标题】:Combining two rows to a single row将两行合并为一行
【发布时间】:2015-02-08 06:16:04
【问题描述】:

我从图 01 所示的查询中得到以下输出。每个员工都有两条记录,显示他们的工作地点和生效日期。当前标志显示由“Y”表示的当前记录。 现在我想将此输出转换为图 02 中所示的以下格式。这里的员工只有一行。它显示了员工的当前记录和转移日期,以前的位置和新的位置。

你能告诉我怎么做吗?

【问题讨论】:

  • 只有两个位置,还是“一个和多个”?
  • 是的。正好两个地点

标签: sql database plsql oracle-sqldeveloper


【解决方案1】:

试试这个:

--PREVIOUSRESULT will be your existing result.

SELECT A.EMPLOYEENO, A.NAME, A.CURRENTFLAG, 
   (SELECT B.LOCATION FROM PREVIOUSRESULT B
    WHERE B.EMPLOYEENO = A.EMPLOYEENO AND B.CURRENTFLAG IS NULL) AS FROMVALUE, 
    A.Location AS ToValue, A.TRANSFERDATE AS EFFECTIVEDATE 
 FROM PREVIOUSRESULT A 
 WHERE A.CURRENTFLAG = 'Y'

--Result

【讨论】:

    【解决方案2】:

    还有一个答案:

    select a.empno, a.ename, a.cflag, 
    (select b.location from empdetails b where b.empno=a.empno and b.cflag is null) "From",
    a.location "To", a.transfer_date from empdetails a where a.cflag is not null;
    

    查看sqlfiddle

    【讨论】:

      【解决方案3】:
      SELECT [Employee No]
      , [Name]
      , MAX([Current Flag]) as [Current Flag]
      , CASE WHEN [Current Flag] IS NULL THEN LOCATION ELSE NULL END AS [FROM]
      , CASE WHEN [Current Flag] = 'Y' THEN LOCATION ELSE NULL END AS [TO]
      , CASE WHEN [Current Flag] = 'Y' THEN [TRANSFER DATE] ELSE NULL END AS [EFFECTIVE DATE]
      FROM Table1
      GROUP BY [Employee No]
      , [Name]
      , CASE WHEN [Current Flag] IS NULL THEN LOCATION ELSE NULL END
      , CASE WHEN [Current Flag] = 'Y' THEN LOCATION ELSE NULL END
      , CASE WHEN [Current Flag] = 'Y' THEN [TRANSFER DATE] ELSE NULL END
      

      【讨论】:

      • 谢谢。但输出中存在问题。 from_date 或 to_date 始终为空!
      【解决方案4】:

      考虑到每个员工有严格的两条记录,我希望这条记录会更快 - 只有一次表扫描,没有嵌套循环连接。

      select 
      empno, 
      ename, 
      max(cflag) cflag, 
      max(location) keep(dense_rank first order by transfer_date) "from",
      max(location) keep(dense_rank last  order by transfer_date) "to",
      max(transfer_date) transfer_date
      from empdetails
      group by empno, ename;
      

      fiddle

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-18
        相关资源
        最近更新 更多