2016-09-22 61 views
2

美好的一天,我试图选择一个数据。请先查看我的查询和表格。如果coloumn具有相同的值,则获取下一行

我有这个疑问

select * from 
    ( 
SELECT * from 
(
select distinct TOP 2row, b.OutletCode as 'Kode Otlet', 
i.Description as 'Area', 
c.Nilai,a.Nip, b.Fullname 'Nama Lengkap', f.positioncode as 'Posisi Sebelumnya', 
case when a.[status]=0 
    then j.ApprovedDate else p.ApprovedDate 
    end as 'Tanggal Upgrade/Demosi Sebelumnya', 
d.positioncode as 'Posisi Baru', a.tanggal as 'Tanggal Upgrade/Demosi' 
from penilaian_header a 
left join Employee b on a.Nip = b.Nip 
left join Position f on b.PositionCode = f.PositionCode 
left join Position d on a.PositionCode = d.PositionCode 
left join arealeader g on g.OutletCode = b.OutletCode 
left join outlet h on g.OutletCode = h.OutletCode 
left join area i on i.areacode = h.areacode 
left join cutoff k on a.periode = k.cutoffcode 
left join 
    (select ROW_NUMBER() OVER(PARTITION BY KodePenilaianH ORDER BY idPenilaiand ASC) AS Row, 
    Nilai,KodePenilaianH from penilaian_Detail) c on a.KodePenilaian = c.KodePenilaianH 
left join 
    (SELECT ROW_NUMBER() OVER (PARTITION BY nip ORDER BY ApprovedDate desc) AS rownumber, 
    ApprovedDate, Nip FROM historyposition) AS p on a.nip=p.nip and p.rownumber = 2 
    left join (SELECT ROW_NUMBER() OVER (PARTITION BY nip ORDER BY ApprovedDate desc) AS rownumber, ApprovedDate, Nip 
    FROM historyposition) AS j on a.nip=j.nip and j.rownumber = 1 
    where a.flag = 1 and h.AreaCode like '%%' 
    and Periode like '%CO-2016-9-16-15%' and a.nip = '1004863' 
    --and tanggal <= k.[to] and tanggal >= k.[from] 
    order by i.Description asc) nilai pivot (sum(nilai) for row in ([1],[2],[3],[4],[5])) piv)A order by Area; 

与上面的查询我得到这个结果

enter image description here

和我有这个表HistoryPosition enter image description here

KodeMutasiP OldPosition NewPosition ApprovedBy ApprovedDate Nip KodePenilaian 
HP0000514  P007 P007   0802678 2016-09-15  1004863 PE0000787 
HP0000513  P007 P007   0802678 2016-04-04  1004863 PE0000130 
NULL   NULL P007   NULL  2016-04-04  1004863 NULL 
NULL   NULL P041   NULL  2016-01-20  1004863 NULL 
NULL   NULL P007   NULL  2015-02-12  1004863 NULL 

确定。所以我想要做的是在第一张照片中设置Posisi SebelumnyaTanggal Upgrade/Demosi Sebelumnya,从第二张照片中设置newpositionApproveddate

但是与此条件 如果newpositionnip山口在第二画面相同与第二行然后跳转到秒,如果第二同与第三然后跳转到第四,如果第四不同与第三然后选择第三个。

我写的查询选择这里是我的查询

select * INTO #tMP from historyposition where nip = '1004863' order by approveddate desc 

declare @NewPosition varchar(50), @NewPositionLast varchar(50), @ApproveDate datetime, @ApproveDateLast datetime 
select top 1 @NewPositionLast = NewPosition, @ApproveDateLast=ApprovedDate from #tmp 
WHILE EXISTS (SELECT * FROM #tMP) 
BEGIN 
    select top 1 @NewPosition = NewPosition, @ApproveDate=ApprovedDate from #tmp 
    if (@NewPosition = @NewPositionLast) 
    begin 
     set @NewPositionLast = @NewPosition 
     set @ApproveDateLast = @ApproveDate 
    end 
    else 
    begin 
     break 
    end 
    delete top(1) #tMP 
END 
select @NewPositionLast , @ApproveDateLast 
drop table #tMP 

,我得到这样的结果

| P007 | 2016-04-04 00:00:00.000 | 

结果是像我的预期。

所以我的问题如何设置Posisi SebelumnyaTanggal Upgrade/Demosi Sebelumnya与我最后一次查询的结果。

对不起,我的英语不好。

这是我的预期结果。

enter image description here

我知道这是同与第一张照片。但它并不正确。因为在我的第一个查询中,我选择了第二行。


select * from 
( 
SELECT * from 
    ( 
select distinct TOP 2row, b.OutletCode as 'Kode Otlet', i.Description as 'Area', 
c.Nilai,a.Nip, b.Fullname 'Nama Lengkap', 
case when 
    l.ShortDesc IS NULL then f.ShortDesc else l.ShortDesc 
end 
    as 'PosisiSebelumnya', 
----- 
z.approveddate, 
------ 
d.ShortDesc as 'Posisi Baru', a.tanggal as 'Tanggal Upgrade/Demosi' 
from penilaian_header a 
    left join Employee b on a.Nip = b.Nip 
    left join Position f on b.PositionCode = f.PositionCode 
    left join Position d on a.PositionCode = d.PositionCode 
    left join position l on a.posisisaatini = l.positioncode 
    left join arealeader g on g.OutletCode = b.OutletCode 
    left join outlet h on g.OutletCode = h.OutletCode 
    left join area i on i.areacode = h.areacode 
    left join cutoff k on a.periode = k.cutoffcode 
    left join 
    (select ROW_NUMBER() OVER(PARTITION BY KodePenilaianH ORDER BY idPenilaiand ASC) AS Row, 
    Nilai,KodePenilaianH from penilaian_Detail) c on a.KodePenilaian = c.KodePenilaianH 
    left join (
    select top(1) Nip,NewPosition, ApprovedDate 
     from (
      select Nip,NewPosition,ApprovedDate 
      , grp = row_number() over(order by ApprovedDate desc) - row_number() over(partition by NewPosition order by ApprovedDate desc) 
      from HistoryPosition 
     ) t 
     where grp = 0 
     order by ApprovedDate 
    )z on z.Nip = a.Nip 
    where a.flag = 1 
    and h.AreaCode like '%%' 
    and Periode like '%CO-2016-9-16-15%' 
    and tanggal <= k.[to] and tanggal >= k.[from] order by i.Description asc) nilai 
    pivot (sum(nilai) for row in ([1],[2],[3],[4],[5])) piv)A order by Area; 

我得到这个。

enter image description here

+0

请显示示例数据和预期输出。 – NEER

+0

@NEER我已更新我的问题。这与第一张图片是一样的,但第一个结果我使用第二行而不是第三行。 – YVS1102

回答

1

你的最后一个脚本retrievs用最小ApprovedDate行。它应该与

SELECT ApprovedDate, NewPosition 
FROM (
    SELECT ROW_NUMBER() OVER (PARTITION BY NewPosition ORDER BY ApprovedDate asc) AS rownumber, ApprovedDate, NewPosition 
    FROM historyposition 
    WHERE nip = '1004863') t 
WHERE rownumber = 1 

一样尝试在较大的查询中使用此片段。

EDIT
检测的NewPosition第一组时historypositionApprovedDate desc odered并采取第一行WITN min ApprovedDate组。

with HistoryPosition as(
    -- sample data 
    select sKodeMutasiP,OldPosition,NewPosition,ApprovedBy 
     ,cast(ApprovedDate as DATE) ApprovedDate, Nip,KodePenilaian 
    from (
     values 
     ('HP0000514','P007','P007',0802678,'2016-09-15',1004863,'PE0000787') 
     ,('HP0000513','P007','P007',0802678,'2016-04-04',1004863,'PE0000130') 
     ,(NULL,NULL,'P007',NULL,'2016-04-04',1004863,NULL) 
     ,(NULL,NULL,'P041',NULL,'2016-01-20',1004863,NULL) 
     ,(NULL,NULL,'P007',NULL,'2015-02-12',1004863,NULL) 
    ) t (sKodeMutasiP,OldPosition,NewPosition,ApprovedBy,ApprovedDate,Nip,KodePenilaian) 
) 
select top(1) NewPosition, ApprovedDate 
from (
    select NewPosition,ApprovedDate 
    , grp = row_number() over(order by ApprovedDate desc) - row_number() over(partition by NewPosition order by ApprovedDate desc) 
    from HistoryPosition 
    where nip = 1004863 
) t 
where grp = 0 
order by ApprovedDate; 

EDIT2 使用此片段在OUTER APPLY而不是LEFT JOIN,因为它依赖于其他表中的数据:

... 
outer apply(
    select top(1) NewPosition, ApprovedDate 
    from (
     select NewPosition,ApprovedDate 
     , grp = row_number() over(order by ApprovedDate desc) - row_number() over(partition by NewPosition order by ApprovedDate desc) 
     from HistoryPosition hp 
     where hp.nip = a.nip -- other table 
    ) t 
    where grp = 0 
    order by ApprovedDate 
    ) npa 

...

+0

好。我认为这不是'最低限度',因为我仍然有相同的价值检查行号码5 – YVS1102

+0

和您的查询我得到'2013-11-05 | \t P007'因为在较早的日期他有不同的'newposition'。那就是P041。 – YVS1102

+0

我明白了。当源表由“ApprovedDate desc”排序时,您需要从第一组“NewPosition”中获取最短日期。它可以通过额外的row_numbering完成。请以文本格式提供'HistoryPosition'数据而不是图片,以便有人可以帮助您。 – Serg

0

如果你的问题是,如何能我组合了两个结果集,使它们出现在单行中,可以使用以下选择:

-- first select 
select 1 one, 2 two, 3 three, 0 joinCondition 

-- second select 
select 'a' a, 'b' b, 'c' c, 0 joinCondition 

-- combined 
select one, two, three, a, b, c 
from (select 1 one, 2 two, 3 three, 0 joinCondition) first 
    inner join (select 'a' a, 'b' b, 'c' c, 0 joinCondition) second 
     on first.joinCondition = second.joinCondition 

这个想法是,我们添加一个虚拟列到两个等值的选择,以便它可以用于加入它们

相关问题