SQL-Abfrage zusammenfassen

Hallo,
wie kann man Zeilen zusammenfassen und dabei die unterschiedlichen Zeilen in Spalten anfügen?

Danke im Voraus :wink:

Soll-Ausgabe:

id Artikelnummer Bezeichnung1 Bezeichnung2
\KON-Standard\Q11\Q11002.sldprt#TM00_TF00 Q110020000 Podestriegel 01 BG Podest Dreieck 760

aktuelle Ausgabe:

id VariableName ValueText
\KON-Standard\Q11\Q11001.sldprt#@ Artikelnummer
\KON-Standard\Q11\Q11001.sldprt#@ Bezeichnung1 Podestriegel 01
\KON-Standard\Q11\Q11001.sldprt#TM00_TF00 Bezeichnung1 Podestriegel 01
\KON-Standard\Q11\Q11001.sldprt#TM42_TF00 Bezeichnung1 Podestriegel 01
\KON-Standard\Q11\Q11001.sldprt#TM03_TF00 Bezeichnung1 Podestriegel 01
\KON-Standard\Q11\Q11001.sldprt#TM00_TF00 Bezeichnung2 BG Podest Quadrat 760
\KON-Standard\Q11\Q11001.sldprt#TM42_TF00 Bezeichnung2 BG Podest Quadrat 760
\KON-Standard\Q11\Q11001.sldprt#TM03_TF00 Bezeichnung2 BG Podest Quadrat 760
\KON-Standard\Q11\Q11002.sldprt#TM00_TF00 Artikelnummer Q110020000
\KON-Standard\Q11\Q11002.sldprt#TM42_TF00 Artikelnummer Q110024200
\KON-Standard\Q11\Q11002.sldprt#TM03_TF00 Artikelnummer Q110020300
\KON-Standard\Q11\Q11002.sldprt#@ Bezeichnung1 Podestriegel 01
\KON-Standard\Q11\Q11002.sldprt#TM00_TF00 Bezeichnung1 Podestriegel 01
\KON-Standard\Q11\Q11002.sldprt#TM42_TF00 Bezeichnung1 Podestriegel 01
\KON-Standard\Q11\Q11002.sldprt#TM03_TF00 Bezeichnung1 Podestriegel 01
\KON-Standard\Q11\Q11002.sldprt#@ Bezeichnung2 BG Podest Dreieck 760
\KON-Standard\Q11\Q11002.sldprt#TM00_TF00 Bezeichnung2 BG Podest Dreieck 760
\KON-Standard\Q11\Q11002.sldprt#TM42_TF00 Bezeichnung2 BG Podest Dreieck 760
\KON-Standard\Q11\Q11002.sldprt#TM03_TF00 Bezeichnung2 BG Podest Dreieck 760
\KON-Standard\Q11\Q11004.sldprt#@ Artikelnummer
\KON-Standard\Q11\Q11004.sldprt#@ Bezeichnung1 Kantholz links
\KON-Standard\Q11\Q11004.sldprt#TM00_TF00 Bezeichnung1 Kantholz links
\KON-Standard\Q11\Q11004.sldprt#TM42_TF00 Bezeichnung1 Kantholz links
\KON-Standard\Q11\Q11004.sldprt#TM03_TF00 Bezeichnung1 Kantholz links
\KON-Standard\Q11\Q11004.sldprt#@ Bezeichnung2 Leiter schräg, PH 1950
\KON-Standard\Q11\Q11004.sldprt#TM00_TF00 Bezeichnung2 Leiter schräg, PH 1950
\KON-Standard\Q11\Q11004.sldprt#TM42_TF00 Bezeichnung2 Leiter schräg, PH 1950
\KON-Standard\Q11\Q11004.sldprt#TM03_TF00 Bezeichnung2 Leiter schräg, PH 1950

aktuelle Abfrage:
Select CONCAT(PROJ.Path, doc.Filename, ‚#‘, CONF.ConfigurationName) as id, var.VariableName, VARVAL.ValueText
FROM Documents as DOC
LEFT JOIN DocumentsInProjects as DOCinPROJ on doc.DocumentID = DOCinPROJ.DocumentID
LEFT JOIN Projects as PROJ on PROJ.ProjectID = DOCinPROJ.ProjectID
LEFT JOIN VariableValue as VARVAL on VARVAL.DocumentID = doc.DocumentID and VARVAL.RevisionNo = dbo.Src_MaxVarVer(doc.DocumentID, VARVAL.VariableID, doc.LatestRevisionNo)
LEFT JOIN Variable as VAR on VAR.VariableID = varval.VariableID
LEFT JOIN DocumentConfiguration as CONF on CONF.ConfigurationID = VARVAL.ConfigurationID
WHERE doc.Filename like ‚Q1100%‘ and CHARINDEX(var.VariableName, ‚Artikelnummer|Bezeichnung1|Bezeichnung2‘) > 0
order by VARVAL.ConfigurationID , var.VariableName

Ohne die sieben(!) Tabellen zu sehen, die in der Abfrage verwurstet werden, ist das eher schwierig.

Stehen die Werte in ‚VariableName‘ fest oder sind die dynamisch?

Man könnte einen Teil der Abfrage als VIEW hinterlegen.

Dann könnte man das gewünschte Ergebnis als Tabelle erzeugen unter Verwendung eines CURSORs und einer WHILE-Schleife.

Oder du kombinierst drei temporäre Abfragen auf die VIEW ‚id - Artikelnummer‘, ‚id - Bezeichnung1‘, ‚id-Bezeichnung2‘ mit einem JOIN zur gewünschten Ausgabe.

Hallo,

habe eine Lösung über PIVOT gefunden.

/* alle Variablennamen suchen */
DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX);
SET @cols = STUFF((SELECT distinct ', ' + QUOTENAME(Variable.VariableName)   
            FROM Variable
			WHERE not VariableName like '{%'
            FOR XML PATH(''), TYPE  
            ).value('.', 'NVARCHAR(MAX)')   
        ,1,1,'');

/*
select @cols
*/

/* Alle Werte suchen und Nebeneinander ausgeben */
set @query = '
SELECT *
FROM (
	Select CONCAT(PROJ.Path, doc.Filename, ''#'', CONF.ConfigurationName) as id, doc.Filename, CONF.ConfigurationName, var.VariableName, VARVAL.ValueText 
	FROM Documents as DOC
		LEFT JOIN DocumentsInProjects as DOCinPROJ on doc.DocumentID = DOCinPROJ.DocumentID 
		LEFT JOIN Projects as PROJ on PROJ.ProjectID  = DOCinPROJ.ProjectID
		LEFT JOIN VariableValue as VARVAL on VARVAL.DocumentID = doc.DocumentID and 
			VARVAL.RevisionNo = dbo.Src_MaxVarVer(doc.DocumentID, VARVAL.VariableID, doc.LatestRevisionNo) 
		LEFT JOIN Variable as VAR on VAR.VariableID = varval.VariableID  
		LEFT JOIN DocumentConfiguration as CONF on CONF.ConfigurationID = VARVAL.ConfigurationID 
	WHERE doc.Filename like ''Q1100%'' /*and CHARINDEX(var.VariableName, ''Artikelnummer, Bezeichnung1, Bezeichnung2'') > 0*/
) as Tab1
PIVOT (
	MAX(ValueText) for VariableName in (' + @cols + ')
) as Tab2
'

execute(@query)

Das Ganze sieht verdammt nach einem komplett dynamisch gestaltetem Datenmodell aus - super konfigurierbar (wenn man es einmal durchschaut hat), aber ein schnelles Select geht halt nicht; und die Performance ist ebenfalls unter jeder Kritik …

Wie der UP schon selber draufkam, hier geht es nur noch mit PIVOT, falls man das Ganze mit einem SELECT erschlagen will.

Wenn ich aber schon mit Cursor arbeite, dann erspare ich mir zusätzliche Views - wobei ich mir bei diesem Datenmodell nicht mehr ganz sicher bin.

1 Like