2013-07-25 14 views
0

我有一個數百萬行需要轉換的文件。我很難得到理想的結果,所以我想要順應專家的意見;如何將多行數據轉換爲帶有單一ID的字符串?

select 
[ID], 
min ([date]) as 'Payment1', 
min ([date]) as 'Payment2', 
where 'Payment2' > 'Payment1' 
min ([date]) as 'Payment3', 
where 'Payment3' > 'Payment2' 
min ([date]) as 'Payment4', 
where 'Payment4' > 'Payment3' 
from [FP&A].[dbo].[PaymentSchedules] 
group by [ID] 
order by [ID] 
+0

我仍然在學習語法,但我希望這很容易理解我試圖拉開。如果這看起來完全失敗,我誠摯的道歉。 –

回答

0

它看起來像你想選擇四個最不同的日期作爲你的四個付款。我將提出一個易於理解的方式來獲得這樣的:

  1. 查找payment1
  2. 加入表中再次找到payment2
  3. 加入表中再次找到payment3
  4. ...

最終的結果是在這裏:

with step1 as (
    select id, min(date) as payment1 
    from ps 
    group by id 
), step2 as (
    select step1.*, min(date) as payment2 
    from step1 
    join ps on step1.id = ps.id 
    where step1.payment1 < ps.date 
    group by step1.id, payment1 
), step3 as (
    select step2.*, min(date) as payment3 
    from step2 
    join ps on step2.id = ps.id 
    where step2.payment2 < ps.date 
    group by step2.id, payment1, payment2 
), step4 as (
    select step3.*, min(date) as payment4 
    from step3 
    join ps on step3.id = ps.id 
    where step3.payment3 < ps.date 
    group by step3.id, payment1, payment2, payment3 
) 
select * from step4 

下面是一個演示它的動作:http://sqlfiddle.com/#!3/66576/8

現在,這使得4個連接,所以表現不是最好的。如果你在性能方面存在問題,那麼我會考慮對日期進行排名,選擇最低的四位(不包括重複項),然後對錶進行旋轉。

0

因此,朋友的一位朋友知道我在做什麼,並想出了這個代碼,它通過兩個步驟完成了這個技巧。我發佈它,以防將來幫助其他人;

Select [DBO].[ID], 
[DBO].[Date], 
count(*) as 'alias1' 
into ##Temp 
from [DBO] left outer join [DBO] as 'alias2' 
on [DBO].[ID] = [alias2].[id] 
And [DBO].[Date] >= [alias2].[Date] 
Group BY [dbo].[id], 
    [dbo].[Date] 
order by [dbo].[ID], [dbo].[alias1] 


Select ##Temp.id, 
MIN(case when [alias1] = 1 then Date Else NULL END) as Payment1, 
MIN(case when [alias1] = 2 then Date Else NULL END) as Payment2, 
MIN(case when [alias1] = 3 then Date Else NULL END) as Payment3, 
MIN(case when [alias1] = 4 then Date Else NULL END) as Payment4, 
MIN(case when [alias1] = 5 then Date Else NULL END) as Payment5, 
MIN(case when [alias1] = 6 then Date Else NULL END) as Payment6, 
MIN(case when [alias1] = 7 then Date Else NULL END) as Payment7, 
MIN(case when [alias1] = 8 then Date Else NULL END) as Payment8, 
MIN(case when [alias1] = 9 then Date Else NULL END) as Payment9 
from ## 
group by ##Temp.id 
order by ##Temp.id 
相關問題