[英]Combining two rows to a single row
我正在从图01所示的查询中获取输出。每个员工都有两条记录,显示他们的工作地点以及生效日期。 当前标志显示由“ Y”表示的当前记录。 现在,我想将此输出转换为图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.