2017-10-12 4 views
0

内の既存のデータから行を展開し、私はこのようになりますテーブルがあります。は、SQL

User HasPermA HasPermB HasPermC 
--------------------------------------- 
Joe True  False  True 
Sally True  True  True 

をそして私はSQLを使用して、次の形式に変換する必要があります。

User PermissionType 
----------------------- 
Joe   A 
Joe   C 
Sally  A 
Sally  B 
Sally  C 

は、どのように私は行くだろうそれについて?

+2

使用するSQLの特定の方言はありますか? 2番目の例は、データを最初に格納する方法です。スキーマの修正の一環としてこれを行うことができれば幸いです。 – tadman

+1

@tadman - ピボット質問の正反対を見るのはおもしろいです(#1のSQL質問には広いマージンが必要です)。 – Twelfth

答えて

3

あなたは、UNION ALLを使用することができます。これは、SQLのあなたの方言は、ブール変数を理解していることを前提としてい

select user, 'A' as PermissionType from t where HasPermA union all 
select user, 'B' from t where HasPermB union all 
select user, 'C' from t where HasPermC ; 

select * 
from 
(
    select user 
     , case when HasPermA is true then 'A' else null end as PermissionType 
    from table 

    union all 

    select user 
     , case when HasPermB is true then 'B' else null end as PermissionType 
    from table 

    union all 

    select user 
     , case when HasPermC is true then 'C' else null end as PermissionType 
    from table 
) sub 
where sub.PermissionType is not null 
0

一つの方法は、私が希望フレーズとして、union allです。 HasPermA = 'true'のようなものが必要かもしれません。

SQLのいくつかの方言は、lateralキーワードまたはapplyキーワード(またはその両方)のいずれかを使用して、ラテラルジョインをサポートします。もしそうなら、私は好き:

参加横(または unpivotクエリ)を使用して
select t.user, v.PermissionType 
from t outer apply 
    (value ('A', HasPermA), ('B', HasPermA), ('C', HasPermA)) v(PermissionType, hasPerm) 
where hasPerm; 

一度だけのテーブルをスキャンするという利点があります。