2017-04-12 72 views
0

我有一個列,「PositionDate」下面的視圖。 我想爲每一行添加一個新的列「貨幣」,其值爲「SEK」,「EUR」,「DKK」。 結果應該是3行/ positiondate,每行一個貨幣。SQL Server 2008中的重複行

電流:

PositionDate 
2017-04-11 
2017-04-10 
2017-04-09 

期望:

PositionDate Currency 
2017-04-11  SEK 
2017-04-11  DKK 
2017-04-11  EUR 
2017-04-10  SEK 
2017-04-10  DKK 
2017-04-10  EUR 

感謝第一個答案! 現在有個新問題。 說我有下表。如果我的連接表與日期和貨幣不匹配,我如何獲取以前的最新值?在空DKK值,我希望它拿起3.請注意,日期不是每天都存在,因爲我沒有在週末加載表。

Select 
    PositionDate, 
    Currency, 
    T2.Value, 
    isnull(t2.value, ?) 
From t1 
left join t2 
on t1.currency = t2.Currency 
and t1.PositionDate = t2.PositionDate 

PositionDate Currency  Value 
2017-04-11  SEK    1 
2017-04-11  DKK    NULL 
2017-04-11  EUR    7 
2017-04-10  SEK    4 
2017-04-10  DKK    3 
2017-04-10  EUR    5 
2017-04-07  SEK    4 
2017-04-07  DKK    3 
2017-04-07  EUR    5 

回答

1

可以cross jointable value constructor做到這一點:

SELECT v.PositionDate, c.Currency 
FROM dbo.YourView AS v 
CROSS JOIN (VALUES ('SEK'), ('EUR'), ('DKK')) AS c (Currency); 

Example on DBFiddle

如果你已經存儲在表中的貨幣,那麼你可以使用此表而不是表值構造函數:

SELECT v.PositionDate, c.Currency 
FROM dbo.YourView AS v 
CROSS JOIN dbo.Currency AS c; 
+0

謝謝!你看到我的新問題了嗎? – Haggan

+0

如果您有新問題,您應該將其作爲新問題發佈。你可以隨時鏈接到這個參考,但由於這個問題已被回答,它不可能吸引新的訪問者到頁面,所以你會通過發佈一個新的問題得到更好的迴應。 – GarethD

+0

謝謝! :) .... – Haggan

1

使用交叉應用

;with dte(a) 
as 
(
select '2017-04-11' union all 
select '2017-04-10' union all 
select '2017-04-09') 
select * from dte c 
cross apply 
(
values('skk'), 
     ('dkk'), 
     ('ekk') 
) b(f) 
0

的所有值硬編碼:

select p.PositionDate, c.Currency 
    from (values('2017-04-11'), ('2017-04-10'), ('2017-04-09')) as P([PositionDate]) 
    cross join (values('skk'), ('dkk'), ('ekk')) c(Currency)