Hej, SELECT A.DT, A.Value, B.Value FROM Table A OUTER JOIN Table B ON A.DT = B.DT Nu så. ... om du inte har SQL Server 2005/2008 kan du skriva så här: Hej! <b>Finns inget som heter OUTER JOIN i SQL Server,</b> @AndersSQL-fråga, sortera på datum
jag har en tabell med datum, instrument och värden. Det är inte säkert att ett instrument har ett värde för alla tidpunkter som ett annat instrument här värden för.
Jag skulle villja få ett recordset som ser ut som följande:
2009-05-12 0,1 0,3
2009-05-11 0,2
2009-05-09 0,5 2,1
2009-05-07 0,5
Kan någon peka mig i rätt riktning? Just nu löser jag det här med VB-kod från ett recordset som ser ut så här:
2009-05-12 0,1
2009-05-12 0,3
2009-05-11 0,2
2009-05-09 0,5
2009-05-09 2,1
2009-05-07 0,5
Men det är lite meckigt. Går det att lösa i SQL:n vore det jäkligt trevligt.Sv: SQL-fråga, sortera på datum
Sv: SQL-fråga, sortera på datum
@Niklas
Finns inget som heter OUTER JOIN i SQL Server,
FULL OUTER JOIN , RIGHT OUTER JOIN eller LEFT OUTER JOIN ska det vara.
Du får själv skriva in det du tänkte på.
För övrigt så kommer frågan inte ge efterfrågat resultat hur du än skriver JOINen.
@Anders
Om du använder SQL Server 2005/2008 kan du använda UNPIVOT operatorn.
Så här (bifogar en exempeltabell med din testdata):
<code>
DECLARE @tabell TABLE(datum datetime, värde1 decimal(2,1), värde2 decimal(2,1));
INSERT INTO @tabell VALUES('2009-05-12', 0.1, 0.3);
INSERT INTO @tabell VALUES('2009-05-11', 0.2, NULL);
INSERT INTO @tabell VALUES('2009-05-09', 0.5, 2.1);
INSERT INTO @tabell VALUES('2009-05-07', NULL, 0.5);
SELECT
CONVERT(varchar(10), datum, 120) AS datum,
värde
FROM
(SELECT datum, värde1, värde2 FROM @tabell) p
UNPIVOT
(värde FOR värden IN (värde1, värde2)) AS unpvt;
</code> Sv: SQL-fråga, sortera på datum
<code>
DECLARE @tabell TABLE(datum datetime, värde1 decimal(2,1), värde2 decimal(2,1));
INSERT INTO @tabell VALUES('2009-05-12', 0.1, 0.3);
INSERT INTO @tabell VALUES('2009-05-11', 0.2, NULL);
INSERT INTO @tabell VALUES('2009-05-09', 0.5, 2.1);
INSERT INTO @tabell VALUES('2009-05-07', NULL, 0.5);
SELECT
a.datum,
a.värde
FROM
(SELECT
CONVERT(varchar(10), datum, 120) AS datum,
värde1 AS värde
FROM @tabell
UNION
SELECT
CONVERT(varchar(10), datum, 120) AS datum,
värde2 AS värde
FROM @tabell) a
WHERE värde IS NOT NULL
ORDER BY a.datum DESC;
</code>Sv:SQL-fråga, sortera på datum
Tack för hjälpen!
Nu kanske jag förklarade dåligt. Kör jag med temp-tabell får jag ut:
<code>
DECLARE @tabell TABLE(datum datetime, värde1 decimal(2,1), värde2 decimal(2,1));
INSERT INTO @tabell VALUES('2009-05-12', 0.1, 0.3);
INSERT INTO @tabell VALUES('2009-05-11', 0.2, NULL);
INSERT INTO @tabell VALUES('2009-05-09', 0.5, 2.1);
INSERT INTO @tabell VALUES('2009-05-07', NULL, 0.5);
SELECT
*
FROM
@tabell
Running [dbo].[StoredProcedure1].
datum värde1 värde2
------ ------ ------
2009-0 0,1 0,3
2009-0 0,2 NULL
2009-0 0,5 2,1
2009-0 NULL 0,5
(4 row(s) affected)
(4 row(s) returned)
@RETURN_VALUE = 0
Finished running [dbo].[StoredProcedure1].
</code>
Kör jag ditt förslag så:
<code>
DECLARE @tabell TABLE(datum datetime, värde1 decimal(2,1), värde2 decimal(2,1));
INSERT INTO @tabell VALUES('2009-05-12', 0.1, 0.3);
INSERT INTO @tabell VALUES('2009-05-11', 0.2, NULL);
INSERT INTO @tabell VALUES('2009-05-09', 0.5, 2.1);
INSERT INTO @tabell VALUES('2009-05-07', NULL, 0.5);
SELECT
a.datum,
a.värde
FROM
(SELECT
CONVERT(varchar(10), datum, 120) AS datum,
värde1 AS värde
FROM @tabell
UNION
SELECT
CONVERT(varchar(10), datum, 120) AS datum,
värde2 AS värde
FROM @tabell) a
WHERE värde IS NOT NULL
ORDER BY a.datum DESC;
Running [dbo].[StoredProcedure1].
datum värde
---------- ------
2009-05-12 0,1
2009-05-12 0,3
2009-05-11 0,2
2009-05-09 0,5
2009-05-09 2,1
2009-05-07 0,5
(4 row(s) affected)
(6 row(s) returned)
@RETURN_VALUE = 0
Finished running [dbo].[StoredProcedure1].
</code>
Men det första sättet att göra det på är ju precis det jag vill ha. Fast jag vet inte hur många kolumner jag behöver, men jag skulle kunna begränsa det till sex stycken. Layout-mässigt finns det också en gräns.Sv:SQL-fråga, sortera på datum
Jag har åtminstone för mig att OUTER JOIN = FULL OUTER JOIN I SQL92?
<b>För övrigt så kommer frågan inte ge efterfrågat resultat hur du än skriver JOINen.</b>
Det är helt rätt, tyvärr tror jag inte att du riktigt har förstått frågan heller...
Anders: Det du ska göra är någon form av pivotering. Det står att du har en kolumn för instrument också, men det visar du inte i ditt första exempel. Jag antar att det finns.
Det finns inbyggt stöd för det du vill göra i SQL Server, men är inte standard. Det är dock inte speciellt komplicerat att göra själv genom att dynamiskt bygga upp en sql-sats.
1. Hämta dina instrument.
instruments = SELECT ID FROM Instruments
2. Hämta ut alla värden för ett instrument
values_x = SELECT Date, Value FROM Table WHERE InstrumentID = X
3. Slå ihop dem med joinar:
(SELECT Date, Value FROM Table WHERE InstrumentID = 1) AS A
FULL OUTER JOIN
(SELECT Date, Value FROM Table WHERE InstrumentID = 2) AS B ON A.DATE = B.DATE
FULL OUTER JOIN
(SELECT Date, Value FROM Table WHERE InstrumentID = 3) AS C ON A.DATE = C.DATE
FULL OUTER JOIN
(SELECT Date, Value FROM Table WHERE InstrumentID = 4) AS D ON A.DATE = D.DATE
...
4. Hämta ut alla kolumner:
SELECT A.Date, A.Value, B.Value, C.Value ... FROM
(SELECT Date, Value FROM Table WHERE InstrumentID = 1) AS A
FULL OUTER JOIN
(SELECT Date, Value FROM Table WHERE InstrumentID = 2) AS B ON A.DATE = B.DATE
FULL OUTER JOIN
(SELECT Date, Value FROM Table WHERE InstrumentID = 3) AS C ON A.DATE = C.DATE
FULL OUTER JOIN
(SELECT Date, Value FROM Table WHERE InstrumentID = 4) AS D ON A.DATE = D.DATE
...Sv: SQL-fråga, sortera på datum
Här kommer jag lära mig mycket! Jag ska nog läsa på lite om "pivotering" (som jag inte har hört talas om tidigare).
Det är flera tabeller som ska joinas in men både värde och instrumentnummer ligger i samma tabell.
Återkommer efter lite försök på egen hand!Sv:SQL-fråga, sortera på datum
Eftersom du ville lära dig mer om pivotering så...
Här kommer en lösning som använder PIVOT operatorn.
OBS! Gäller för SQL Server 2005/2008
<code>
DECLARE @tabell TABLE(date datetime, varde decimal(2,1));
INSERT INTO @tabell VALUES('2009-05-12', 0.1);
INSERT INTO @tabell VALUES('2009-05-12', 0.3);
INSERT INTO @tabell VALUES('2009-05-11', 0.2);
INSERT INTO @tabell VALUES('2009-05-09', 0.5);
INSERT INTO @tabell VALUES('2009-05-09', 2.1);
INSERT INTO @tabell VALUES('2009-05-07', 0.5);
SELECT date, [1] AS Värde1, [2] AS Värde2
FROM
(
SELECT
date,
varde,
ROW_NUMBER() OVER(PARTITION BY date ORDER BY varde) AS seq
FROM @tabell
)st
PIVOT
(
MAX(Varde)
FOR SEQ IN ([1],[2])
)pvt
ORDER BY date DESC;
</code>
Det som jag inte får kläm på är vad det är som styr att t.ex 0,5 här under ska vara på värde2
och inte i värde1
2009-05-07 0,5
I PIVOT lösningen ovan hanteras inte det beroende på indata.
@Niklas
<b>tyvärr tror jag inte att du riktigt har förstått frågan heller</b>
Nä precis, du har helt rätt jag hade inte förstått frågan (tyvärr being the operative word) <:(
Däremot så finns det mig veterligen ingen implicit tolkning i ANSI SQL -92 mellan OUTER --> FULL.