2017-06-04 8 views
1

マイデータ:SQL Serverの:GROUP BYが1列に基づいて、列が他の列に基づいて取得

ColumnA     Column B   ColumnC   
A       Hi     Yes 
A       Hello    NULL 
B       Hola    Yes 
B       Hola    Yes 
B       Hi     NULL 
C       ABCD    Yes 

私のSQLは、次の操作を行うことができる必要があります。列によって

  1. グループ

の結果にあるYesとNullの両方を含むAのグループのみを選択します。期待結果:

ColumnA     Column B   ColumnC   
A       Hi     Yes 
A       Hello    NULL 
B       Hola    Yes 
B       Hola    Yes 
B       Hi     NULL 

上記のルールを満たすすべての値を選択するにはどうすればよいですか?

+0

あなたの期待した結果をテキストとして投稿してください。 – TheGameiswar

+0

なぜあなたの検索結果にあなたの検索結果が表示されますか – TheGameiswar

答えて

1
select * from t 
    where 
columnA in 
    (select columnA from T where columnC is NULL) and 
columnA in 
    (select columnA from T where columnC = 'Yes') 
2

一つの方法は、GROUP BYHAVINGを使用しています:

select columnA 
from t 
group by columnA 
having sum(case when columnC is null then 1 else 0 end) > 0 and 
     sum(case when columnC = 'yes' then 1 else 0 end) > 0; 
1

私はフィルタリングが実際より良い代わりに「を有する」の「WHERE」節で扱うことと思います。
Trueの場合、「行を制限するためには「いいえ、aggrは必要ありません」の結果で、YesとNullの両方を含むAのグループのみを選択してください。私は、SUM機能を使用するための追加コストがあるのか​​どうかはわかりませんが、なぜ追加作業を行うのですか?
私はそれが遠い比較かどうか分からないが、なぜあなたは店に行くだろう、リンゴの束をピックアップし、あなたがレジスターに着くとき、悪くなるいくつかのアウトを引き出し始めますか?

SELECT ColumnA, ColumnB, ColumnC 
FROM myTable 
WHERE ColumnC IS NULL || ColumnC = 'yes' 
--GROUP BY ColumnA, ColumnB, ColumnC --commented per additional comment below. 

つ以上のノート:

はこれを試してみてください。あなたのサンプルデータをもう一度チェックしてください。グループ化しているのであれば、columnAの値として 'c'を含む行を除外したことだけを伝えてください。

ColumnA     Column B   ColumnC 
B       Hola    Yes 

のみ、彼らは一緒にグループ化されていたように、1つとして表示されていたであろうが、あなたのサンプル出力には、あなたが二回あり、それを持っている...

1
create table #t(ColumnA varchar(10),ColumnB varchar(10),ColumnC varchar(10)) 
insert into #t 
    select 'A','Hi','Yes' union all 
    select 'A','Hello',NULL union all 
    select 'B','Hola','Yes' union all 
    select 'B','Hola','Yes' union all 
    select 'B','Hi',NULL union all 
    select 'C','ABCD','Yes' 
select * from ( 
    select *,sum(case when ColumnC='YES' THEN 1 else 0 end)over(partition by ColumnA) as YesCount 
      ,sum(case when ColumnC is null then 1 else 0 end)over(partition by ColumnA) as NULLCount 
    from #t 
) as t where t.YesCount>0 and t.NULLCount>0 
:また、私は2つの行があることを前提となり
 
    ColumnA ColumnB ColumnC YesCount NULLCount 
1 A Hi Yes 1 1 
2 A Hello NULL 1 1 
3 B Hola Yes 2 1 
4 B Hola Yes 2 1 
5 B Hi NULL 2 1 
1

、によっておよび持つcluaseグループなしでこれを試す

create table #t(ColumnA varchar(10),ColumnB varchar(10),ColumnC varchar(10)) 
insert into #t 
    select 'A','Hi','Yes' union all 
    select 'A','Hello',NULL union all 
    select 'B','Hola','Yes' union all 
    select 'B','Hola','Yes' union all 
    select 'B','Hi',NULL union all 
    select 'C','ABCD','Yes' 

    ;With CTE as 
    (
    select * 
    ,ROW_NUMBER()over(partition by ColumnA order by ColumnA)rn 
    from #t 
    where ColumnC is null or ColumnC='Yes' 
    ) 
    select * from cte c 
    where exists(select columnA from cte c1 
    where c.ColumnA=c1.ColumnA and rn>1) 

    drop table #t 
1
select t1.* 
from t t1 
inner join 
    (select sum(case when t3.colc is null then 1 when t3.colc = 'Yes' then 1 else 0 end) as cnt, 
    t3.cola 
    from t t3 
    group by cola) t2 on t1.cola = t2.cola 
    where t2.cnt >= 2; 
関連する問題