2017-07-05 5 views
0

Ich habe eine .net-Webanwendung, die SQL Server 2008 verwendet. Die Datentabelle, die ich in einem Raster anzeigen möchte, enthält Spalten, die tatsächlich Zeilen einer anderen Tabelle sind. Im Moment mache ich das in der BLL, indem ich Daten in Datentabellen lese; Abrufen der Daten aus einer anderen Tabelle und Umwandeln in Spalten der ersten Datentabelle und dann Durchlaufen jeder Datenzeile in dieser Datentabelle zum Auffüllen der neuen Spalten. Sehr zeitaufwendig und langsam.SQL-Abfrage, Zeilen in Spalten zu transponieren - revisited

Ich glaube, dass dies durch eine Abfrage in SQL 2012 und höher mit "Transpose" oder etwas Ähnliches getan werden kann, aber nicht sicher, ob es in 2008 möglich ist. Ich recherchierte und versuchte mit "Pivot", aber ich bin nicht gut in SQL und konnte es nicht zur Arbeit bringen.

Dies ist ein vereinfachtes Beispiel für DB-Tabellen und was ich angezeigt werden müssen:

Facility Table: 
FacilityID 
12345 
67890 
99999 

PartnerInfo table: 
PartnerID Partner 
1   Partner1 
2   Partner2 
3   Partner3 

FacilityPartner table: 
FacilityID PartnerID Active 
12345   1    1 
12345   3    0 
67890   2    1 
67890   3    1 

eine Abfrage brauchen so etwas wie zurückzukehren:

FacilityID Partner1 Partner2 Partner3 
12345   true  false  true 
67890   false  true  true 
99999   false  false  false 

ich diese Frage gepostet here und bekam eine Antwort das schien zu funktionieren (Abfrage unten). Jedoch, wenn ich die Liste der Einrichtungen, scheint die Abfrage alle auszuschließen, die keine Partner haben (z. B. Anlage ID 99999 wird nicht angezeigt). Ich habe versucht, mit der Abfrage zu spielen und innere Joins zu linken Joins zu ändern, aber das hat nicht geholfen.

declare @facility table (facilityId int) 
declare @PartnerInfo table (partnerid int, partnerN varchar(1000)) 
declare @FacilityPartner table (facilityId int,partnerid int) 

insert into @facility values (12345) 
insert into @facility values (67890) 

insert into @PartnerInfo values (1, 'partner1') 
insert into @PartnerInfo values (2, 'partner2') 
insert into @PartnerInfo values (3, 'partner3') 

insert into @FacilityPartner values(12345, 1) 
insert into @FacilityPartner values(12345, 3) 
insert into @FacilityPartner values(67890, 2) 
insert into @FacilityPartner values(67890, 3) 

select f.facilityId as facid, p.PartnerN as partn, 100 as val 
FROM @facility f 
Inner join @FacilityPartner fp on f.facilityId = fp.facilityId 
INNER JOIN @PartnerInfo p on p.partnerid = fp.partnerid 

select facid, Partner1 , partner2,partner3 FROM 

(select f.facilityId as facid, p.PartnerN as partn, 100 as val 
FROM @facility f 
Inner join @FacilityPartner fp on f.facilityId = fp.facilityId 
INNER JOIN @PartnerInfo p on p.partnerid = fp.partnerid) x 
PIVOT(
avg(val) 
for partn in ([partner1], [partner2],[partner3]) 
) as pvt 

Antwort

0

Das Ändern der inneren Verbindung zur linken äußeren Verbindung würde perfekt funktionieren.

aktualisiert basierend auf OP Kommentar:

select facid, isnull(Partner1, 0) p1 , isnull(partner2, 0) p2, isnull(partner3, 0) p3 
FROM 
(select f.facilityId as facid, p.PartnerN as partn, cast(fp.active as int) as val 
FROM @facility f 
left outer join @FacilityPartner fp on f.facilityId = fp.facilityId 
left outer JOIN @PartnerInfo p on p.partnerid = fp.partnerid) x 
PIVOT(
avg(val) 
for partn in ([partner1], [partner2],[partner3]) 
) as pvt 

Ergebnis:

facid p1 p2 p3 
------------------ 
12345 1 0 0 
67890 0 1 1 
99999 0 0 0 
+0

Wenn FacilityPartner Tabelle eine Spalte "Aktiv" (true/false oder 0/1) hat wie das Rück I 0 für diesen Partner, als hätte er das Falg auf Null gesetzt? In der aktualisierten FacilityPartner-Tabelle, in der die zweite Zeile "false" enthält, würde Ihr Ergebnis beispielsweise "12345 1 0 0" anstelle von "12345 1 0 1" anzeigen? – NoBullMan

+0

Siehe aktualisierte Antwort. – vendettamit

Verwandte Themen