2010-12-16 11 views
1

Ich habe dieses T-SQL (vereinfacht):T-SQL Kombinieren mehrerer Zeilen in einreihig

select 3.00 as score1, null as score2, null as score3, null as score4 
union all 
select null as score1, 4.5 as score2, 1.5 as score3, null as score4 

Welche dies erzeugt:

score1 score2 score3 score4 
------------------------------ 
3.00 NULL NULL NULL 
NULL 4.5  1.5  NULL 

Aber ich es in einer Reihe anschließen möchten, wie folgt:

Sorry - ich zeichne leer (es ist spät am Tag).

Benötige ich eine temporäre Tabelle?

Der Grund, warum ich das tue, ist, dass ich die folgende Assoziation haben:

Bewertungen 1 .. * Noten

So regelmäßig beitreten 1 Zeile für jeden Score erzeugt - aber ich möchte legen Sie einen Datensatz (in einer anderen Tabelle), die eine Spalte für jeden Datensatz hat - wenn Sie wissen, was ich meine:

INSERT INTO OtherTable (ReviewId, Score1, Score2, Score3, Score4) 
???? 

Hoffnung, den Sinn macht.

EDIT

Basierend auf @OMG Ponies Antwort (die er nur entfernt), kam ich mit auf den Punkt:

SELECT CASE MAX(x.score1) WHEN 0 THEN NULL ELSE MAX(x.score1) END AS score4 
     CASE MAX(x.score2) WHEN 0 THEN NULL ELSE MAX(x.score2) END AS score4 
     CASE MAX(x.score3) WHEN 0 THEN NULL ELSE MAX(x.score3) END AS score4 
     CASE MAX(x.score4) WHEN 0 THEN NULL ELSE MAX(x.score4) END AS score4 
    FROM (select 3.00 as score1, 0 as score2, 0 as score3, 0 as score4 
     union all 
     select 0 as score1, 4.5 as score2, 1.5 as score3, 0 as score4) x 

Aber es ist ziemlich hässlich. Irgendwelche anderen Ideen?

+0

Das ist seltsam, denn ich dachte MAX Rückkehr NULL unterstützt, damit es nicht die gebraucht haben sollte FALL:/ –

+0

ja schlimmsten Fall, ich habe eine Lösung oben. aber wie gesagt, es ist wirklich hässlich. Ich muss NULL (nicht 0) einfügen, weshalb ich den beschissenen Fall brauche. Eck. was noch wichtiger ist, ich brauche ISNULL's in das Subjekt (in Wirklichkeit), um NULL in 0 zu konvertieren, und wandle das dann wieder zurück in NULL für die Einfügung, lol. schmerzhaft – RPM1984

Antwort

0

endete mit meiner ursprünglichen Abfrage gehen (dank @OMG Ponies für mich auf dem richtigen Weg setzen):

SELECT CASE MAX(x.score1) WHEN 0 THEN NULL ELSE MAX(x.score1) END AS score4 
     CASE MAX(x.score2) WHEN 0 THEN NULL ELSE MAX(x.score2) END AS score4 
     CASE MAX(x.score3) WHEN 0 THEN NULL ELSE MAX(x.score3) END AS score4 
     CASE MAX(x.score4) WHEN 0 THEN NULL ELSE MAX(x.score4) END AS score4 
    FROM (select 3.00 as score1, 0 as score2, 0 as score3, 0 as score4 
     union all 
     select 0 as score1, 4.5 as score2, 1.5 as score3, 0 as score4) x 
0

Unter der Annahme, dass nur eine der beiden Zeilen einen Wert in score1, score2, ... hat, schreiben Sie Ihre Abfrage andernfalls mit der NULLIF-Funktion um.

SELECT 
    NULLIF(ISNULL(NULLIF(x.score1, 0), y.score1), 0) score1, 
    NULLIF(ISNULL(NULLIF(x.score2, 0), y.score2), 0) score2, 
    NULLIF(ISNULL(NULLIF(x.score3, 0), y.score3), 0) score3, 
    NULLIF(ISNULL(NULLIF(x.score4, 0), y.score4), 0) score4 
FROM (SELECT 3.00 AS score1, 0 AS score2, 0 AS score3, 0 AS score4) x 
CROSS JOIN (SELECT 0 AS score1, 4.5 AS score2, 1.5 AS score3, 0 AS score4) y 
+0

Yup - das funktioniert auch - aber nicht viel anders als die Bearbeitung in meiner Frage, nur der Unterschied ist NULLIF anstelle von CASE. Gibt es noch andere Unterschiede? – RPM1984

0

Als ich es (SQL 2008) versuchen, scheint eine einfache MAX() es mit zu arbeiten:

SELECT 
    MAX(score1), 
    MAX(score2), 
    MAX(score3), 
    MAX(score4) 
FROM 
    (select 3.00 as score1, null as score2, null as score3, null as score4 
    union all 
    select null as score1, 4.5 as score2, 1.5 as score3, null as score4) s 

Ich lief dieser Test

declare @t table (i int null) 
insert @t values (null) 
insert @t values (1) 
select MAX(i) from @t 

Ist das, was Sie tun möchten?

+0

Nicht wirklich. Ich muss mit dem enden, was ich in der obigen Frage habe - eine einzelne Zeile mit 4 Spalten. Diese 4 Spalten werden aus 4 verschiedenen Zeilen aggregiert. Es sei denn, ich missverstanden Ihre Antwort ... (ich könnte sehr gut sein, es ist 18 Uhr) – RPM1984

+0

Ich hatte gerade bearbeitet, um zu klären - Ich bin wirklich nur Ihre aktuelle Abfrage mit einigen MAX-Funktionen wickeln. –

0

Die @OMG Ponies/RPM1984 Abfrage scheint zu funktionieren:

SELECT MAX(x.score1), 
     MAX(x.score2), 
     MAX(x.score3), 
     MAX(x.score4) 
    FROM (select 3.00 as score1, null as score2, null as score3, CAST(null as int) as score4 
     union all 
     select null as score1, 4.5 as score2, 1.5 as score3, null as score4) x 

was zur Folge hat:

3.00 4.5 1.5 NULL 

Ich bin nicht sicher, was Sie tun würden, wenn mehrere Zeilen die gleiche Punktzahl definieren .


Ich muss CAST (null als int) in den vierten Spalte, denn sonst gibt es keine Möglichkeit für SQL Server den Typ der vierten Spalte zu erarbeiten - das alles sind zwei Nullen hat, und NULL-Werte können jeder Art sein.

+0

Ja, ich muss mich nicht um mehrere Zeilen mit der gleichen Punktzahl kümmern. Für ein gegebenes Feld (z. B. Score1) kann von allen Zeilen (kann 0-10 sein) nur einer den Score haben, alle anderen sind null. Ich bin überrascht, dass 'CAST (null as int)' tatsächlich funktioniert. Warum hast du in deiner Antwort 'CAST (null als int)' 'in der ersten Auswahl, aber' null als score4' in der zweiten Auswahl? – RPM1984

+0

@ RPM1984 - Ich * denke * Ich brauchte nur die Umwandlung der Null für score4 zu tun - sonst kann SQL Server nicht herausfinden, was der Datentyp für die vierte Spalte ist. Aber mit einer echten Arbeits-Tabelle müssten Sie SQL Server diese Information nicht geben - sie würde es von der Spaltendefinition erhalten. –

Verwandte Themen