2016-12-07 1 views
1

Ich habe eine Tabelle mit Personen und eine Tabelle mit Clienttypen (verknüpft mit einer dritten Tabelle namens Clienttypendetails), mit denen diese Personen verknüpft sind. Clienttypen können "Freund", "Feind", "Alien" oder "Monster" sein. Manche Leute können mehr als eine davon haben und manche Leute haben keine.SQL-Abfrage zur Ausgabe aller Ergebnisse, aber nur eines bestimmten Werts aus einer Liste ohne Duplizierung

Was ich wirklich zu bekommen versucht, ist ein Ausgang so etwas wie:

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

So John ist sowohl ein Freund und ein Monster, während Eric nicht ist. Mit der Frage, die ich versucht habe zu erstellen (nur mit einer Spalte für die Freunde im ersten Augenblick), bekomme ich eine Zeile für alle, aber für diejenigen, die Freunde sind, bekomme ich 2 Zeilen für sie - eine, um zu sagen, dass sie ein Freund und einer sind zu sagen NULL

Macht irgendwas Sinn?

Abfrage unter:

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 

Ich bin wirklich nicht sicher, dass der beste Weg, es zu nähern so dass jede Hilfe/Rat sehr dankbar empfangen werden würde.

Dank Lee

+2

Ihre Unterabfrage keine hat ' FROM-Klausel. Das ergibt keinen Sinn. –

Antwort

0

Sie suchen im Grunde für einen Dreh mit Streichern, und man konnte schreibt es die pivot oder apply verwenden, aber dies scheint einfacher.

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 

Für eine Pivot-Version, das ist ein gutes Beispiel: 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 

Diese Pivot auf Ihrem Schema mit so etwas wie dies geschehen könnte:

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

Vielen Dank !! Die erste Option hat es perfekt gemacht! – wolfgang

Verwandte Themen