繁体   English   中英

将两行合并为一行

[英]Combining two rows to a single row

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

图01

图02

你能告诉我怎么做吗?

尝试这个:

--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'

- 结果

再回答一个:

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

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

给定每位员工严格的两条记录,我希望这一记录会更快-仅进行一次表扫描,没有嵌套循环联接。

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;

小提琴

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM