111945
Goto Top

MS SQL View - Zeile in Spalte

Hallo Zusammen,

folgende View habe ich erstellt und folgendes Ergebnis bekommen. Leider brauche ich die Rufnummernart in einer Spalte, sodass ich zum guten Schluss nur eine Zeile als Ausgabe bekomme.

Vielleicht hat jemand ideen, wie das gelößt wird.

Vielen Dank


SELECT 
                      dbo.Firma.Name1, dbo.Firma.Name2, dbo.Firma.Name3, dbo.Firma.Name4, dbo.Firma.Name5, dbo.Firma.Gruppe, dbo.KommFirma.Art, dbo.KommFirma.Anschluß, 
                      dbo.Person.Titel, dbo.Person.Anrede, dbo.Person.Vorname, dbo.Person.Nachname, dbo.KommDw.Art AS Expr1, dbo.KommDw.Anschluß AS Expr2, 
                      dbo.Person.Gruppe2, dbo.Firma.Gruppe2 AS Expr3, dbo.Firma.Straße, dbo.Firma.Land, dbo.Firma.PLZ, dbo.Firma.Ort, dbo.Firma.PPLZ, dbo.Firma.PFort, 
                      dbo.Firma.Postfach
FROM         dbo.Person INNER JOIN
                      dbo.KommDw ON dbo.Person.PID = dbo.KommDw.PID INNER JOIN
                      dbo.Firma ON dbo.KommDw.FID = dbo.Firma.FID INNER JOIN
                      dbo.KommFirma ON dbo.Firma.FID = dbo.KommFirma.FID
WHERE     (dbo.Firma.Name1 = 'H_Name1')  


Ausgabe:

982ebacc1d6de2496d6315254bd286dc

Content-Key: 268545

Url: https://administrator.de/contentid/268545

Printed on: April 26, 2024 at 11:04 o'clock

Member: MadMax
MadMax Apr 08, 2015 at 17:12:43 (UTC)
Goto Top
Hallo StfnCstr,

drei Möglichkeiten:
1. Es gibt eine begrenzte Zahl an Kommunikationsarten (z.B. Telefon, Fax, Email und Mobil) und jeder darf nur jeweils eine dieser Kommunikationsmittel besitzen. Dann kannst Du die Kommunikationstabelle für jede Art mit left join einbinden und hast lauter einzelne Spalten für jedes Kommunikationmittel. Für KommFirma könnte das etwa so aussehen:
SELECT 
                      dbo.Firma.Name1, dbo.Firma.Name2, dbo.Firma.Name3, dbo.Firma.Name4, dbo.Firma.Name5, dbo.Firma.Gruppe, t.Anschluß as Telefon, x.Anschluß as Telefax, e.Anschluß as eMail, 
                      dbo.Person.Titel, dbo.Person.Anrede, dbo.Person.Vorname, dbo.Person.Nachname, dbo.KommDw.Art AS Expr1, dbo.KommDw.Anschluß AS Expr2, 
                      dbo.Person.Gruppe2, dbo.Firma.Gruppe2 AS Expr3, dbo.Firma.Straße, dbo.Firma.Land, dbo.Firma.PLZ, dbo.Firma.Ort, dbo.Firma.PPLZ, dbo.Firma.PFort, 
                      dbo.Firma.Postfach
FROM         dbo.Person INNER JOIN
                      dbo.KommDw ON dbo.Person.PID = dbo.KommDw.PID INNER JOIN
                      dbo.Firma ON dbo.KommDw.FID = dbo.Firma.FID
                      left join dbo.KommFirma t ON dbo.Firma.FID = t.FID and t.Art = 'Telefon'   
                      left join dbo.KommFirma x ON dbo.Firma.FID = x.FID and x.Art = 'Telefax'  
                      left join dbo.KommFirma e ON dbo.Firma.FID = e.FID and e.Art = 'eMail'  
WHERE     (dbo.Firma.Name1 = 'H_Name1')  


2. Evtl. mit der Pivot-Funktion (ist in der Hilfe beschrieben, nutze ich auch nicht täglich face-smile). Ist ähnlich wie Punkt 1., nutzt aber eine SQL-Funktion.

3. Du liest alle Kommunikationsmittel zu einer Person in einen Text ein (z.B. "Fon: 123, Fax: 456, Email: sonstwas@irgendwo.de") und fügst dann die eine Textspalte ein. Das Zusammenlesen geht z.B. mit XML ganz gut:
SELECT 
                      dbo.Firma.Name1, dbo.Firma.Name2, dbo.Firma.Name3, dbo.Firma.Name4, dbo.Firma.Name5, dbo.Firma.Gruppe, k.KommMittel, 
                      dbo.Person.Titel, dbo.Person.Anrede, dbo.Person.Vorname, dbo.Person.Nachname, dbo.KommDw.Art AS Expr1, dbo.KommDw.Anschluß AS Expr2, 
                      dbo.Person.Gruppe2, dbo.Firma.Gruppe2 AS Expr3, dbo.Firma.Straße, dbo.Firma.Land, dbo.Firma.PLZ, dbo.Firma.Ort, dbo.Firma.PPLZ, dbo.Firma.PFort, 
                      dbo.Firma.Postfach
FROM         dbo.Person INNER JOIN
                      dbo.KommDw ON dbo.Person.PID = dbo.KommDw.PID INNER JOIN
                      dbo.Firma ON dbo.KommDw.FID = dbo.Firma.FID
		      cross apply (select (select Art + ': ' + Anschluß + ', ' from KommFirma where FID = Firma.FID order by Art for xml path, type).value ('.', 'varchar (max)') as KommMittel) k  
WHERE     (dbo.Firma.Name1 = 'H_Name1')  

Gruß, Mad Max