2017-04-12 143 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)