2010-12-16 76 views
1

我有這個T-SQL(簡體):T-SQL結合多個列數分爲單列

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 

這主要生產:

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

,但我想它加入到一行,像這樣:

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

對不起 - 即時繪圖空白(這是晚了一天)。

我需要臨時表嗎?

原因我做這是我有以下的關聯:

評論1 .. *成績

所以常規連接產生1行中每個分數 - 但我想插入一條記錄(到另一臺),有每個記錄的列 - 如果你知道我的意思:

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

希望是有道理的。

編輯

基於@OMG小馬的回答(這是他剛刪除),我想出了這個:

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

這是奇怪的,因爲我覺得最大支持返回NULL,所以應該不會有必要的案例:/ – 2010-12-16 06:19:09

+0

是的最壞的情況下,我有一個解決方案上面。但正如我所說這真的很難看。我需要插入NULL(不是0),這就是爲什麼我需要蹩腳的情況。 ECK。更重要的是我需要ISNULL的主題(實際上)將NULL轉換爲0,然後將其轉換爲NULL再次插入,lol。痛苦的 – RPM1984 2010-12-16 06:21:06

回答

0

結束了我原來的查詢會(感謝@OMG爲小馬把我在正確的軌道上):

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

在假定兩行中只有一行在score1,score2中有值的情況下,否則使用NULLIF函數重寫您的查詢。

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

是的 - 這也起作用 - 但與我的問題編輯沒有太大的區別,唯一的區別是NULLIF而不是CASE。還有其他的區別嗎? – RPM1984 2010-12-16 06:56:32

0

當我嘗試它(SQL 2008)用一個簡單的MAX()似乎工作:

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 

我跑這個測試

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

這是你想要做什麼?

+0

不是。我需要結束我在上面的問題 - 單行,4列。這4列是從4個不同的行彙總而來的。除非我誤解你的答案......(我很可能,現在是下午6點) – RPM1984 2010-12-16 06:55:31

+0

我剛剛編輯澄清 - 我真的只是用一些MAX函數包裝你當前的查詢。 – 2010-12-16 23:41:22

0

的@OMG小馬/ RPM1984查詢似乎工作:

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 

導致:

3.00 4.5 1.5 NULL 

我不知道,如果多行定義了相同的分數,你會怎麼做。


我不得不CAST(null作爲INT)添加到第四列,否則沒有辦法爲SQL Server摸出第四列的類型 - 所有它有兩個空值,和空白可是任何類型的。

+0

是的,我不必擔心多行相同的分數。對於給定的字段(例如Score1),在所有行中(可以是0-10),只有一個會得分,其他所有字都是空的。我很驚訝'CAST(null as int)'實際上有效。爲什麼在你的答案中你有第一選擇'CAST(null as int)',但在第二選擇中'null as score4'? – RPM1984 2010-12-16 11:33:03

+0

@ RPM1984 - 我*認爲*我只需要真正需要對score4進行空值轉換 - 否則,SQL Server無法確定第四列的數據類型。但是通過一個真正的工作表,您不必向SQL Server提供這些信息 - 它可以從列定義中獲得。 – 2010-12-16 11:34:56