2016-12-07 63 views
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

相關問題