2017-05-09 10 views
1

私は実際にMS SQL Serverの結果にいくつかの重複を作成する方法を探しています。私は通常、重複を作成しない方法を探していることを理解していますが、この例ではすべての個々の行が返される必要があります。複数の結果を含むケース式

私は約1,000万行と33列のテーブルを扱っています。テーブルは最初のカラムのIDで構成され、残りのカラムには 'Y'または 'NULL'があります。大部分のカラムがNULLです。

1000万行のうち、800万行には1つの「Y」行しか残っておらず、残りの200万行には複数の列があり、「Y」が並んでいます。

単一の「Y」の行の場合、基本的なケース式は、結果の単一の列を作成するために完全に正常に機能します。

これは私の問題です。2つの行、1つの行に複数の「Y」がある場合は、それぞれの「Y」に1つ必要です。

以下は、小さな識別されていないサンプルです。

ID  FLAG1 FLAG2   FLAG3  FLAG4 FLAG5 
188  NULL NULL   NULL  NULL NULL 
194  Y  NULL   NULL  NULL NULL 
200  Y  NULL   NULL  NULL Y 

このようなケースエクスプレッションを使用しようとしています。

Select 
ID 
,Case 
    When [FLAG1] = 'Y' 
    Then 'FLAG1' 
    When [FLAG2] = 'Y' 
    Then 'FLAG2'  
End as 'Service_Line' 

私が欲しいのは、このような結果です。

ID  Service_Line 
194 FLAG1 
200 FLAG1 
200 FLAG5 

私の問題は、Caseの式が最初の結果を返すだけなので、私はこれで終わります。

ID  Service_Line 
194 FLAG1 
200 FLAG1 

私が達成しようとしているものに適したケースエクスプレッションか、これについて別の方法で取り組もうとしていますか?

+0

どのDBシステム(MySQL、PostgreSQL、Oracle、MS SQL Serverなど)を使用していますか?このような問題をエレガントな方法で解決するために利用できる機能には、これが異なる場合があります。 – IMSoP

+1

質問を編集し、使用しているデータベースを指定してください。 –

+1

RDBMSがUNPIVOTをサポートしているかどうか確認してください。 –

答えて

0

caseは適切ではありません。一般的なSQLのアプローチは次のようになります。

select id, 'FLAG1' as flag 
from t 
where flag1 = 'Y' 
union all 
select id, 'FLAG2' as flag 
from t 
where flag2 = 'Y' 
union all 
select id, 'FLAG3' as flag 
from t 
where flag3 = 'Y' 
. . . 

他の(より効率的な)メソッドがありますが、使用しているデータベースによって異なります。

私が注意する必要があります(concat()自体はANSI標準です)もちろん

select id, 
     concat(case when flag1 = 'Y' then 'FLAG1 ' else '' end, 
       case when flag2 = 'Y' then 'FLAG2 ' else '' end, 
       case when flag3 = 'Y' then 'FLAG3 ' else '' end, 
       . . . 
      ) as flags 
from t; 

concat()ための構文は、データベースによって異なる場合があります:caseあなたは、単一の行の値が必要な場合は適切なアプローチです。最後のスペースをトリミングすることもできます。

+0

返信いただきありがとうございますが、結果として1つのセルに2つの項目が表示されます。私はそれらを1つのセルに連結するのではなく、各アイテムの行を探しています。 –

+0

あなたの最初のオプションは動作しているようです。私は更新を伴って回覧する。 –

関連する問題