2016-12-07 5 views
1

私は人と人のテーブルをクライアントタイプの詳細と呼ばれる3番目のテーブルにリンクしています。クライアントタイプは、「友人」、「敵」、「エイリアン」、「モンスター」のいずれかです。一部の人々はこれらのうちの1つ以上を持つことができ、一部の人々は誰も持っていません。エリックは任意のではないのに対し、だから、ジョンは友達とモンスターの両方ですべての結果を出力するSQLクエリですが、重複しないでリストから特定の値のみを返します。

ID | Name | Friend | Enemy | Alien | Monster | 
35 | John | Friend | -blank- | -blank- | Monster | 
42 | Eric | -blank- | -blank- | -blank- | -blank- | 

:私は本当に取得しようとしている何

は次のように出力なものです。私が作成しようとしている質問(最初の瞬間に友人のための列だけで)私は誰のための行を取得していますが、友人のために私は彼らのために2行を取得しています - 言うことNULL

これは意味がありますか?以下

問合せ:

SELECT DISTINCT 
     cl.ClientID, 
     cl.dcFirstName, 
     (SELECT Dwh.DimClientTypes.dctName 
     WHERE (Dwh.DimClientTypes.dctGuid IN ('52CD80A6-D4D7-4FD3-8AE8-644A40FEC108')) 
     ) AS Friend 
FROM Dwh.DimClientTypeDetails 
    LEFT OUTER JOIN Dwh.DimClientTypes ON Dwh.DimClientTypeDetails.dctdTypeGuid = Dwh.DimClientTypes.dctGuid 
    LEFT OUTER JOIN Dwh.DimClients AS cl ON Dwh.DimClientTypeDetails.dctdClientGuid = cl.dcClientGUID 

は、私は本当に任意のヘルプ/アドバイスは非常に感謝して受信されるだろう、それをアプローチする最良の方法はよく分かりません。

おかげ リー

+2

あなたのサブクエリには 'を持っていませんFROM'節。それは意味をなさない。 –

答えて

0

あなたは基本的に文字列を含むピボットを探している、とあなたはpivotapplyを使用して、それを書くことができるが、これは単純なようです。ピボットバージョンについては

select 
    Id  = cl.ClientId 
    , Name = cl.dcFirstName 
    , Friend = max(case when ct.dctName = 'Friend' then ct.dctName else null end) 
    , Enemy = max(case when ct.dctName = 'Enemy' then ct.dctName else null end) 
    , Alien = max(case when ct.dctName = 'Alien' then ct.dctName else null end) 
    , Monster = max(case when ct.dctName = 'Monster' then ct.dctName else null end) 
    from Dwh.DimClients as cl 
    left join Dwh.DimClientTypeDetails ctd on ctd.dctdClientGuid = cl.dcClientguid 
    left join Dwh.DimClientTypes ct  on ct.dctGuid   = ctd.dctdTypeGuid 
    group by cl.ClientId, cl.dcFirstName 

、これは良い例です。http://rextester.com/XDACE35377

create table #t (Id int not null, Name varchar(32) not null, ClientType varchar(32) null) 
insert into #t values 
(35, 'John', 'Friend') 
,(35, 'John', 'Monster') 
,(42, 'Eric', null); 
select 
    Id 
    , Name 
    , pvt.Friend 
    , pvt.Enemy 
    , pvt.Alien 
    , pvt.Monster 
    from #t 
    pivot (max(ClientType) for ClientType in ([Friend],[Enemy],[Alien],[Monster])) pvt 

このピボットは、このようなものを使用してスキーマ上で行うことができます。

with c as (
    select 
     Id   = cl.ClientId 
    , Name  = cl.dcFirstName 
    , ClientType = ct.dctName 
    from Dwh.DimClients as cl 
     left join Dwh.DimClientTypeDetails ctd on ctd.dctdClientGuid = cl.dcClientguid 
     left join Dwh.DimClientTypes ct  on ct.dctGuid   = ctd.dctdTypeGuid 
) 
select 
    Id 
    , Name 
    , pvt.Friend 
    , pvt.Enemy 
    , pvt.Alien 
    , pvt.Monster 
    from c 
    pivot (max(ClientType) for ClientType in ([Friend],[Enemy],[Alien],[Monster])) pvt 
+0

ありがとうございました!最初のオプションは完璧にトリックでした! – wolfgang

関連する問題