2017-04-12 5 views
0

Ich habe unter Ansicht mit einer Spalte "PositionDate". Ich möchte eine neue Spalte "Währung" mit den Werten "SEK", "EUR", "DKK" für jede Zeile hinzufügen. Ergebnis sollte 3 Zeilen/Position mit einer Währung pro Zeile sein.Doppelte Zeilen in SQL Server 2008

Aktuell:

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

Wunsch:

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 

Dank für das erste Antworten! Jetzt eine neue Frage. Sag ich habe unter Tisch. Wie kann ich den letzten vorherigen Wert abrufen, wenn meine beigefügte Tabelle nicht mit dem Datum und der Währung übereinstimmt? Auf dem Null-DKK-Wert möchte ich, dass es 3 abholt. Beachten Sie, dass Daten nicht jeden Tag existieren, da ich die Tabellen nicht am Wochenende lade.

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 

.

Antwort

1

Sie können cross join mit einem table value constructor dies zu tun:

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

Example on DBFiddle

Wenn Sie Ihre Währungen in einer Tabelle gespeichert, Sie dann kann diese Tabelle anstelle eines Tabellenwertkonstruktors verwenden:

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

Dank! Hast du meine neue Frage gesehen? – Haggan

+0

Wenn Sie eine neue Frage haben, sollten Sie sie als neue Frage veröffentlichen. Sie können immer eine Verbindung zu diesem Verweis herstellen, aber da diese Frage beantwortet wurde, ist es unwahrscheinlich, dass neue Besucher auf die Seite gelangen. Sie erhalten also eine bessere Antwort, indem Sie eine neue Frage stellen. – GarethD

+0

Danke! :) .... – Haggan

1

Verwendung Kreuz anwenden

;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

mit allen Werten hartcodiert:

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)