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
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
Siehe aktualisierte Antwort. – vendettamit