2016-10-01 12 views
1

idがレコードを1つしか持たず、 idには複数のレコードがありますidにレコードが1つしかなく、idに複数のレコードがある場合はnull値を選択している場合はnullを持つレコードを選択してください。

以下はサンプルの例です。

Id Field1 Field2 
1 Null 34 
1 Yes  52 
2 Null 56 
3 No  46 

と出力は、SQLクエリを使用して行うことができますどのように

Id Field1 Field2 
1 Yes 52 
2 Null 56 
3 No  46 

+1

複数のレコードがあり、すべてがnullの場合はどうしますか? – Bohemian

+0

複数のレコードがnullでない場合 – dsz

答えて

1

2008以降のバージョンのSQL Serverでは、次のクエリを使用します。

;with cte_1 
    As 
    (select *, count(1) over (partition by id order by id) Cnt 
    From YourTable) 
    Select Id,Field1,Field2 
    From Cte_1 
    Where Field1 is null and Cnt=1 
    UNION 
    Select Id,Field1,Field2 
    From YourTable 
    Where field1 is not null 

出力例:

enter image description here

2005バージョンについては、以下のクエリを使用してください。

SELECT t.Id,Field1,Field2 
FROM #T t 
    JOIN (select ID, count(ID) CntId 
      From #t 
      GROUP BY ID 
      HAVING COUNT(ID)=1)t1 on t.ID=t1.ID 
WHERE t.Field1 is null 

    UNION 

SELECT Id,Field1,Field2 
FROM #T 
WHERE Field1 is NOT NULL 
ORDER BY ID 

出力例:

enter image description here

+0

お返事ありがとうございます。しかし、それはカウントまたはRow_Numberメッセージ102、レベル15、状態1、行3未満のエラーになる 'オーダー'の近くに構文が正しくありません。 – user2514925

+0

使用しているSQL Serverのバージョンは? –

+0

更新されたスクリプトを参照してください。 –

0

あなたが唯一のグループごとに1つのまたは2つの行を持つことができ、それらのいずれかがnullを持っている必要がありますように聞こえます。これらの前提を使用すると、簡単なクエリで逃げることができます。

select 
    Id, 
    min(Field1) as Field1, 
    coalesce(min(case when Field1 is not null then Field2 end), min(Field2)) as Field2 
from T 
group by Id 

また、Field2はヌル可能ではないというマイナーな前提もあります。実際はそれより少し微妙ですが、必要な場合は回避策があります。

existsを使用して解決し、サブクエリが別のオプションです:

select * from T t1 
where Field is not null or not exists (
    select 1 from T t2 
    where t2.Id = t1.Id and t2.Field is not null 
) 
0

使用このコード:

Select Distinct ID, 
(Select Max(Field1) From Table1 Where ID=Tbl1.ID) as Field1, 
(Select Max(Field1) From Table1 Where ID=Tbl1.ID) as Field2 
From Table1 as Tbl1 

結果:

:また、コードの下

ID   Field1  Field2 
----------- ---------- ----------- 
1   Yes  52 
2   NULL  56 
3   No   46 

(3 row(s) affected) 

は、同じ結果を得ます

Select Distinct ID, 
(Select Top 1 Field1 From Table1 Where ID=Tbl1.ID Order By Field1 Desc) as Field1, 
(Select Top 1 Field2 From Table1 Where ID=Tbl1.ID Order BY field1 Desc) as Field2 
From Table1 as Tbl1 
関連する問題