Benutzer mit den meisten Antworten
Zusammenfassen von Zeilen mit gleichem Key

Frage
-
Hallo, ich habe eine SQL View (Server 2012) in der ich mehrere Tabellen verknüpfe.
In der Change Log Tabelle sind mehrere Zeilen (LogText) pro Zeichnungsnummer (DrawNum). Wenn ich die Query so ausführe kriege ich leider mehrere Zeilen pro Zeichnunsnummer ausgegeben, pro ChangeLog Eintrag eine Zeile. Ist es möglich die ChangeLog Einträge irgendwie zusammenzufassen, dass ich pro Zeichnung nur noch eine Zeile habe und die verschiedenen ChangeLog Einträge in einer Zelle zusammengefasst sind? Hier die Syntax meiner View:
SELECT Erp.ProjPhase.ProjectID, Erp.ProjPhase_UD.MachineID_c AS EquipmentID, Erp.ProjPhase_UD.Machine_c AS Equipment, Erp.JobAsmbl.JobNum AS JobID, Erp.ProjPhase.Description AS JobDescription, Erp.JobAsmbl.AssemblySeq AS AssemblyID, Erp.JobAsmbl.Description AS [Assembly Description], Erp.JobAsmbl.DrawNum AS Drawing, Erp.JobAsmbl.RevisionNum AS [Drawing Rev], Erp.JobAsmbl.RequiredQty AS Quantity, Erp.JobAsmbl.CommentText AS Comment, (CASE WHEN SUM(CASE WHEN JobMtl_UD.IsShippingItem_c = 'TRUE' THEN JobMtl_UD.TotalWeight_c ELSE 0 END) = 0 THEN SUM(CASE WHEN JobMtl_UD.IsPreAssembly_c = 'TRUE' THEN JobMtl_UD.TotalWeight_c ELSE 0 END) ELSE SUM(CASE WHEN JobMtl_UD.IsShippingItem_c = 'TRUE' THEN JobMtl_UD.TotalWeight_c ELSE 0 END) END) AS [Weight/Asm], (CASE WHEN SUM(CASE WHEN JobMtl_UD.IsShippingItem_c = 1 THEN JobMtl_UD.TotalWeight_c ELSE 0 END) * JobAsmbl.RequiredQty = 0 THEN SUM(CASE WHEN JobMtl_UD.IsPreAssembly_c = 1 THEN JobMtl_UD.TotalWeight_c ELSE 0 END) * JobAsmbl.RequiredQty ELSE SUM(CASE WHEN JobMtl_UD.IsShippingItem_c = 1 THEN JobMtl_UD.TotalWeight_c ELSE 0 END) * JobAsmbl.RequiredQty END) AS [Total Weight], (CASE WHEN SUM(CASE WHEN JobMtl_UD.IsShippingItem_c = 1 AND JobMtl_UD.FabricationPart_c = 1 THEN JobMtl_UD.TotalWeight_c ELSE 0 END) = 0 THEN SUM(CASE WHEN JobMtl_UD.IsPreAssembly_c = 1 AND JobMtl_UD.FabricationPart_c = 1 THEN JobMtl_UD.TotalWeight_c ELSE 0 END) ELSE SUM(CASE WHEN JobMtl_UD.IsShippingItem_c = 1 AND JobMtl_UD.FabricationPart_c = 1 THEN JobMtl_UD.TotalWeight_c ELSE 0 END) END) * Erp.JobAsmbl.RequiredQty AS [Total FabWeight], CAST(Ice.ChgLog.DateStampedOn AS datetime) AS [Last Rev Date], Ice.ChgLog.LogText AS [Rev Comment]
FROM Ice.ChgLog RIGHT OUTER JOIN
Erp.JobHead INNER JOIN
Erp.JobAsmbl_UD INNER JOIN
Erp.JobAsmbl ON Erp.JobAsmbl_UD.ForeignSysRowID = Erp.JobAsmbl.SysRowID ON Erp.JobHead.JobNum = Erp.JobAsmbl.JobNum INNER JOIN
Erp.ProjPhase ON Erp.JobHead.JobNum = Erp.ProjPhase.WBSJobNum INNER JOIN
Erp.ProjPhase_UD ON Erp.ProjPhase.SysRowID = Erp.ProjPhase_UD.ForeignSysRowID ON Ice.ChgLog.Key2 = CAST(Erp.JobAsmbl.JobNum AS nvarchar(20)) + '~' + CAST(Erp.JobAsmbl.AssemblySeq AS nvarchar(20)) LEFT OUTER JOIN
Erp.JobMtl_UD INNER JOIN
Erp.JobMtl ON Erp.JobMtl_UD.ForeignSysRowID = Erp.JobMtl.SysRowID ON Erp.JobAsmbl.JobNum = Erp.JobMtl.JobNum AND Erp.JobAsmbl.AssemblySeq = Erp.JobMtl.AssemblySeq
GROUP BY Erp.ProjPhase.ProjectID, Erp.JobAsmbl.JobNum, Erp.ProjPhase.Description, Erp.JobAsmbl.AssemblySeq, Erp.JobAsmbl.DrawNum, Erp.JobAsmbl.RevisionNum, Erp.JobAsmbl.RequiredQty,
Erp.JobAsmbl.CommentText, Erp.JobAsmbl.Description, Ice.ChgLog.DateStampedOn, Ice.ChgLog.LogText, Erp.ProjPhase_UD.MachineID_c, Erp.ProjPhase_UD.Machine_c
HAVING (Erp.JobAsmbl.AssemblySeq > 0)Vielen Dank für eure Hilfe im Voraus
Brian
Antworten
-
Hallo Brian,
schau im ersten Schritt erst mal, ob die Zusammenfassung so ist wie Du die haben möchtest bzw. ich die verstanden habe.
Wenn ja, würden im zweiten Schritt nur noch die Ergebnisse zur Basisabfrage per JOIN hinzugefügt.
Wenn nein, stell doch bitte mal Beispieldaten in Tabellenform zur Verfügung, wie die Ausgabe jetzt aussieht, und wie die Ausgabe aussehen soll.
Den Code kann man übrigens auch strukturiert (mit Zeilenumbrüchen und Einrückungen) erstellen; dann wird es halbwegs verständlich. Das die JOINS so funktionieren - ich bin überrascht, aber von mir aus ...
Schonen Abend.
WITH Basisabfrage AS ( SELECT Erp.ProjPhase.ProjectID, Erp.ProjPhase_UD.MachineID_c AS EquipmentID, Erp.ProjPhase_UD.Machine_c AS Equipment, Erp.JobAsmbl.JobNum AS JobID, Erp.ProjPhase.Description AS JobDescription, Erp.JobAsmbl.AssemblySeq AS AssemblyID, Erp.JobAsmbl.Description AS [Assembly Description], Erp.JobAsmbl.DrawNum AS Drawing, Erp.JobAsmbl.RevisionNum AS [Drawing Rev], Erp.JobAsmbl.RequiredQty AS Quantity, Erp.JobAsmbl.CommentText AS Comment, (CASE WHEN SUM(CASE WHEN JobMtl_UD.IsShippingItem_c = 'TRUE' THEN JobMtl_UD.TotalWeight_c ELSE 0 END) = 0 THEN SUM(CASE WHEN JobMtl_UD.IsPreAssembly_c = 'TRUE' THEN JobMtl_UD.TotalWeight_c ELSE 0 END) ELSE SUM(CASE WHEN JobMtl_UD.IsShippingItem_c = 'TRUE' THEN JobMtl_UD.TotalWeight_c ELSE 0 END) END) AS [Weight/Asm], (CASE WHEN SUM(CASE WHEN JobMtl_UD.IsShippingItem_c = 1 THEN JobMtl_UD.TotalWeight_c ELSE 0 END) * JobAsmbl.RequiredQty = 0 THEN SUM(CASE WHEN JobMtl_UD.IsPreAssembly_c = 1 THEN JobMtl_UD.TotalWeight_c ELSE 0 END) * JobAsmbl.RequiredQty ELSE SUM(CASE WHEN JobMtl_UD.IsShippingItem_c = 1 THEN JobMtl_UD.TotalWeight_c ELSE 0 END) * JobAsmbl.RequiredQty END) AS [Total Weight], (CASE WHEN SUM(CASE WHEN JobMtl_UD.IsShippingItem_c = 1 AND JobMtl_UD.FabricationPart_c = 1 THEN JobMtl_UD.TotalWeight_c ELSE 0 END) = 0 THEN SUM(CASE WHEN JobMtl_UD.IsPreAssembly_c = 1 AND JobMtl_UD.FabricationPart_c = 1 THEN JobMtl_UD.TotalWeight_c ELSE 0 END) ELSE SUM(CASE WHEN JobMtl_UD.IsShippingItem_c = 1 AND JobMtl_UD.FabricationPart_c = 1 THEN JobMtl_UD.TotalWeight_c ELSE 0 END) END) * Erp.JobAsmbl.RequiredQty AS [Total FabWeight], CAST(Ice.ChgLog.DateStampedOn AS datetime) AS [Last Rev Date], Ice.ChgLog.LogText AS [Rev Comment] FROM Ice.ChgLog RIGHT OUTER JOIN Erp.JobHead INNER JOIN Erp.JobAsmbl_UD INNER JOIN Erp.JobAsmbl ON Erp.JobAsmbl_UD.ForeignSysRowID = Erp.JobAsmbl.SysRowID ON Erp.JobHead.JobNum = Erp.JobAsmbl.JobNum INNER JOIN Erp.ProjPhase ON Erp.JobHead.JobNum = Erp.ProjPhase.WBSJobNum INNER JOIN Erp.ProjPhase_UD ON Erp.ProjPhase.SysRowID = Erp.ProjPhase_UD.ForeignSysRowID ON Ice.ChgLog.Key2 = CAST(Erp.JobAsmbl.JobNum AS nvarchar(20)) + '~' + CAST(Erp.JobAsmbl.AssemblySeq AS nvarchar(20)) LEFT OUTER JOIN Erp.JobMtl_UD INNER JOIN Erp.JobMtl ON Erp.JobMtl_UD.ForeignSysRowID = Erp.JobMtl.SysRowID ON Erp.JobAsmbl.JobNum = Erp.JobMtl.JobNum AND Erp.JobAsmbl.AssemblySeq = Erp.JobMtl.AssemblySeq GROUP BY Erp.ProjPhase.ProjectID, Erp.JobAsmbl.JobNum, Erp.ProjPhase.Description, Erp.JobAsmbl.AssemblySeq, Erp.JobAsmbl.DrawNum, Erp.JobAsmbl.RevisionNum, Erp.JobAsmbl.RequiredQty, Erp.JobAsmbl.CommentText, Erp.JobAsmbl.Description, Ice.ChgLog.DateStampedOn, Ice.ChgLog.LogText, Erp.ProjPhase_UD.MachineID_c, Erp.ProjPhase_UD.Machine_c HAVING (Erp.JobAsmbl.AssemblySeq > 0) ) --mehrere Zeilen (LogText) pro Zeichnungsnummer (DrawNum) , x_LogText AS ( SELECT DISTINCT Erp.JobAsmbl.DrawNum, Ice.ChgLog.LogText FROM Basisabfrage ) --ChangeLog Einträge zusammenzufassen, dass pro Zeichnung nur noch eine Zeile und die verschiedenen ChangeLog Einträge in einer Zelle zusammengefasst sind , XML_Ausgabe AS ( select JobAsmbl.DrawNum, stuff(( select ', ' + cast(Ice.ChgLog.LogText as varchar(255)) from x_LogText where (Erp.JobAsmbl.DrawNum = results.Erp.JobAsmbl.DrawNum) order by Ice.ChgLog.LogText for xml path ('')) ,1,2,'') as x_LogText from x_LogText results group by JobAsmbl.DrawNum ) SELECT * FROM XML_Ausgabe
- Als Antwort vorgeschlagen Christoph Muthmann Donnerstag, 31. August 2017 11:52
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Donnerstag, 7. September 2017 12:12