2011-12-23 13 views
2

SQL Serverを使用して、選択されたすべてのものを通じて一貫性のあるNULL以外の値のみを取得する方法行。行の値が異なるヌル値で複数の行を1つに結合する方法

A B  C  D 
NULL NULL text NULL 
+0

これは、複数の行を編集するとき形態で使用クエリの:値が充填された唯一のフィールドは、全体選択で同じ値を有するものです。 – Daniel

答えて

3
declare @t table(A int, b varchar(10), c varchar(max), d int) 

insert @t values(10, null, 'text', null) 
insert @t values(4, 'abc', 'text', null) 
insert @t values(10, 'def', 'text', null) 


select case when max(rna) > 1 then null else min(a) end, 
case when max(rnb) > 1 then null else min(b) end, 
case when max(rnc) > 1 then null else min(c) end, 
case when max(rnd) > 1 then null else min(d) end 
from 
(
select rna = rank() over(order by a), 
rnb = rank() over(order by b), 
rnc = rank() over(order by c), 
rnd = rank() over(order by d), 
a, b,c,d 
from @t 
) e 

テキストの列がある場合は、列の型をvarchar(max)に置き換えます。テキストの列は古くなっています。

カウント(distinct col1)を使用するのは最初の考えですが、null値はカウントされません。

select count(distinct a) from (select cast(null as int) a) b 

戻り0行

+0

RANK()との素敵な遊び – MatBailie

+0

皆さん、本当にありがとうございます!ありがとうございます! – Daniel

4
create table #t (col1 int, col2 char(3), col3 char(4), col4 int) 
go 
insert into #t select 10, null, 'text', null 
insert into #t select 4, 'abc', 'text', null 
insert into #t select 4, 'def', 'text', null 
go 

select 
    case when count(distinct isnull(col1, 0)) > 1 then null else max(col1) end as 'col1', 
    case when count(distinct isnull(col2, '')) > 1 then null else max(col2) end as 'col2', 
    case when count(distinct isnull(col3, '')) > 1 then null else max(col3) end as 'col3', 
    case when count(distinct isnull(col4, 0)) > 1 then null else max(col4) end as 'col4' 
from 
    #t 
go 

drop table #t 
go 

EDIT

A B  C  D 
10 NULL text NULL 
4 abc text NULL 
4 def text NULL 

は、次の行を与える必要があり、私はt-clausen.dkで識別される問題を処理するために、ISNULLを追加しましたが、これはのみ動作します「デフォルトの場合'値(すなわちゼロと空文字列)は実データには現れません。

データ型に関するDanielのコメントも正しいですが、データ型がわからないため、代替案を提示するのは簡単ではありません。実際のデータ型を使用する自己完結型のテストスクリプトを提供することが、このような質問をする最良の方法です。

+0

私はこのような解決策を考えていました。問題は "null"がカウントされていないことです。最後の挿入を削除すると、 –

+0

count()がすべてのタイプで機能しないということがわかります。たとえば、ntext列では機能しません。 – Daniel

+0

@Daniel - text、ntext、およびimageはすべて廃止予定であり、使用しないでください。代わりにVARCHAR(max)NVARCHAR(max)とVARBINARY(max)を使用してください。あなたは実際に非難された型の列を持っていますか? – MatBailie

2
SELECT 
    CASE WHEN COUNT(DISTINCT col1) = 1 
      AND COUNT(col1) = COUNT(*) 
     THEN MIN(col1) 
    END AS col1 
    , CASE WHEN COUNT(DISTINCT col2) = 1 
      AND COUNT(col2) = COUNT(*) 
     THEN MIN(col2) 
    END AS col2 
    , CASE WHEN COUNT(DISTINCT col3) = 1 
      AND COUNT(col3) = COUNT(*) 
     THEN MIN(col3) 
    END AS col3 
    , CASE WHEN COUNT(DISTINCT col4) = 1 
      AND COUNT(col4) = COUNT(*) 
     THEN MIN(col4) 
    END AS col4 
FROM 
    tableX 
+0

+1本当に素敵でシンプルで、 –

+0

@ t-clausen.dk:Thanx。「COUNT(DISTINCT column)= 1」は「MIN(列)= MAX(列)」に置き換えることもできます。 –

関連する問題