2016-09-22 91 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 

這個想法是,我們添加一個虛擬列到兩個等值的選擇,以便它可以用於加入它們

相關問題