[英]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.