簡體   English   中英

T-SQL將多行合並為單行

[英]T-SQL Combine Multiple Rows Into Single Row

我有這個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 .. *分數

因此,常規聯接會為每個Score產生1行-但我想插入一條記錄(到另一個表中),每條記錄都有一個列-如果您知道我的意思:

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

希望有道理。

編輯

基於@OMG Ponies答案(他剛剛刪除了),我想到了這個:

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

但這很丑。 還有其他想法嗎?

假設兩行中只有一行在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

當我使用簡單的MAX()嘗試使用(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

這是你想做的嗎?

@OMG Ponies / 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無法計算出第四列的類型-它只有兩個null,並且null可以是任何類型。

結束了我的原始查詢(由於@OMG Ponies使我走上了正確的軌道):

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM