2010-12-16 9 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 

しかし、私は1つの行にそれに参加したいです、このように:

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

ごめんなさい - 私の絵は空です(今日は遅いです)。

一時テーブルが必要ですか?

私はこれをやっている理由は、私は以下の協会持っているということです。

レビューを1 .. *スコア

ので、定期的に各スコアのために1行を生成し参加する - しかし、私がしたいです各レコードの列を持っていること、(別のテーブルへの)レコードを挿入する - あなたは私が何を意味するか知っている場合:

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

理にかなっている希望。 (彼は単に削除)@OMGポニーの回答に基づいて

EDIT

、私はこの思い付いた:

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

奇妙だ、私はそれが必要とされているべきではありませんので、MAXはNULLを返すサポート思ったのcuzケース:/ –

+0

ええ、最悪の場合、上記の解決策があります。しかし私が言ったように、それは本当に醜いです。私はNULLを挿入する必要があります(0ではない)、なぜ私は奇妙な場合が必要です。 eck。さらに、私はNULLを0に変換するためにISNULLが(現実には)ISNULLを必要とするでしょう。そして、それを再びLOLのNULLに変換してください。痛いです – RPM1984

答えて

0

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

ええ - それもあまりにも - 私の質問の編集とほとんど違いはありません、違いはCASEの代わりにNULLIFです。他の違いはありますか? – RPM1984

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

+0

私はちょうど明確に編集しました - 私は実際にいくつかのMAX機能であなたの現在のクエリをラッピングしています。 –

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 

複数の行が同じスコアを定義した場合、私はあなたがしたいかわからないんだけど。

私がそうでなければ、SQL Serverは4列目のタイプを仕事にするための方法はありませんので、4列目にCAST(intとしてnull)を追加する必要が

- すべてのそれは2つのNULL、およびヌルありましたことができますどんなタイプでもよい。私の元のクエリ(右のトラックに私を置くための@OMGポニーのおかげで)一緒に行くことになった

+0

ええ、私は同じスコアで複数の行を心配する必要はありません。与えられたフィールド(例えば、Score1)については、すべての行(0-10の可能性がある)のうち、1つだけがスコアを持ち、他はすべてnullになります。私は 'CAST(int as null)'が実際に動作するのに驚いています。あなたの答えでなぜ最初の選択で 'CAST(intとしてnull)'がありますが、2番目の選択で 'null as score4'ですか? – RPM1984

+0

@ RPM1984 - 私は思っています* score4のためにnullをキャストする必要があっただけです - そうでなければ、SQL Serverが4番目の列のデータ型を調べる方法がありません。しかし、実際の作業テーブルでは、SQL Serverにこの情報を与える必要はありません。列定義から取得することになります。 –