2017-10-23 2 views
2

Wir haben eine Funktionalität, um einige Datensätze in unsere Datenbank zu exportieren. Während des Exports tritt ein Fehler auf, dass wir uns in unsere Datenbank einloggen.Kombinierte Spaltendaten müssen als SQL Abfrage erhalten

Dies ist die Log-Tabelle Daten:

enter image description here

Jetzt brauche ich diese Aufzeichnungen in der folgenden Art und Weise zu zeigen:

enter image description here

Dies ist die SQL-Abfrage, die Sie verwenden können, Test

CREATE TABLE #TEMP 
(
    ExportId INT, 
    AssigneeID INT, 
    HomeAssignmentID INT, 
    HostAssignmentID INT, 
    Error NVARCHAR(MAX) 
) 

INSERT INTO #TEMP              
SELECT * FROM (             
SELECT 1123 AS ExportId,3234 AS AssigneeID,0 AS HomeAssignmentID,0 AS HostAssignmentID ,'Gender does not exist' AS Error       
UNION ALL                
SELECT 1123 AS ExportId,3234 AS AssigneeID,2043 AS HomeAssignmentID ,0 AS HostAssignmentID,'Error while processing Assignee' AS Error      
UNION ALL  
SELECT 1123 AS ExportId,3234 AS AssigneeID,2043 AS HomeAssignmentID ,1768 AS HostAssignmentID,'Error while processing Home Assignment' AS Error 
UNION ALL 
SELECT 1123 AS ExportId,3234 AS AssigneeID,2044 AS HomeAssignmentID ,0 AS HostAssignmentID,'Error while processing Assignee' AS Error 
UNION ALL 
SELECT 1123 AS ExportId,3234 AS AssigneeID,2044 AS HomeAssignmentID ,1769 AS HostAssignmentID,'Error while processing Home Assignment' AS Error 
UNION ALL 
SELECT 1123 AS ExportId,3577 AS AssigneeID,2058 AS HomeAssignmentID ,0 AS HostAssignmentID,'Home Country does not exist in master data.' AS Error 
UNION ALL 
SELECT 1123 AS ExportId,3577 AS AssigneeID,2058 AS HomeAssignmentID ,2011 AS HostAssignmentID,'Host Country does not exist in master data.' AS Error 
UNION ALL 
SELECT 1123 AS ExportId,3577 AS AssigneeID,2059 AS HomeAssignmentID ,0 AS HostAssignmentID,'Home Country does not exist in master data.' AS Error 
UNION ALL 
SELECT 1123 AS ExportId,3577 AS AssigneeID,2059 AS HomeAssignmentID ,2012 AS HostAssignmentID,'Error occurred in Assignment Home processing.' AS Error 
UNION ALL 
SELECT 1123 AS ExportId,3578 AS AssigneeID,2060 AS HomeAssignmentID ,2015 AS HostAssignmentID,'Host Country does not exist in master data.' AS Error 
) AS X 
+0

So müssen Sie Gruppe durch den Text in einem einzelne Reihe? –

+0

ja .. Sie sind korrekt –

+0

Ihr Bild passt nicht zu Ihrer Probe, es gibt 10 Zeilen in Ihren Beispieldaten und 9 in Ihrem Ergebnisbild. Also fehlt eine Zeile? –

Antwort

1

Auf der Grundlage Ihrer Daten können Sie die Gruppierungsspalte mit Fensterfunktionen und eine Ordnungs Spalte erhalten:

select t.*, t2.error 
from (select distinct exportid, assigneeid, HomeAssignmentID, HostAssignmentID 
     from t 
     where HomeAssignmentID <> 0 and HostAssignmentID <> 0 
    ) join 
    t t2 
    on t2.exportid = t.exportid and t2.assigneeid = t.assigneeid and 
     (t2.HomeAssignmentID = t.HomeAssignmentID or t2.HomeAssignmentID = 0) 

Diese im Wesentlichen die zu jedem Fehler vier Spalten hinzufügt. Aufgrund der Art der Daten kann ein bestimmter Fehler mehreren Zeilen zugeordnet werden.

Eine Gruppe wird durch die vier Spalten in der ersten Unterabfrage definiert.

In SQL Server 2017+ können Sie dann diese Abfrage in einer Aggregation setzen:

select exportid, assigneeid, HomeAssignmentID, HostAssignmentID, 
     string_agg(error, ' 
') within group (order by hostassignmentid, homeassignmentid) as error 
from (select t.*, t2.error 
     from (select distinct exportid, assigneeid, HomeAssignmentID, HostAssignmentID 
      from #temp 5 
      where HomeAssignmentID <> 0 and HostAssignmentID <> 0 
      ) join 
      #temp t2 
      on t2.exportid = t.exportid and t2.assigneeid = t.assigneeid and 
       (t2.HomeAssignmentID = t.HomeAssignmentID or t2.HomeAssignmentID = 0) 

      ) t 
    ) t 
group by exportid, assigneeid, HomeAssignmentID, HostAssignmentID; 

In früheren Versionen, müssen Sie XML:

with t as (
     select t.*, t2.error 
     from (select distinct exportid, assigneeid, HomeAssignmentID, HostAssignmentID 
      from t 
      where HomeAssignmentID <> 0 and HostAssignmentID <> 0 
      ) join 
      t t2 
      on t2.exportid = t.exportid and t2.assigneeid = t.assigneeid and 
       (t2.HomeAssignmentID = t.HomeAssignmentID or t2.HomeAssignmentID = 0) 
    ) 
select exportid, assigneeid, HomeAssignmentID, 
     stuff((select ' 
' + error 
       from t t2 
       where t2.exportid = t.exportid and t2.assigneeid = t.assigneeid and 
        t2.HomeAssignmentID = t.HomeAssignmentID and 
        t2.HostAssignmentID = t.HostAssignmentID 
       order by t2.hostassignmentid, t2.homeassignmentid 
       for xml path ('') type 
      ).value('.', 'varchar(max)' 
        ), 1, 1, '' 
      ) as error 
from (select distinct exportid, assigneeid, HomeAssignmentID, HostAssignmentID 
     from t 
    ) t; 
+0

Das passt nicht OP Wunsch Ausgabe. Erstellen Sie nur 3 Gruppen. http://rextester.com/TKOIO30687 –

+0

@JuanCarlosOropeza. . . Viel komplizierter als ich zuerst dachte - und ich dachte schon, es wäre ziemlich kompliziert. –

+0

@ SajithA.K. Auch wenn dies das richtige Ergebnis liefert, garantiert die Reihenfolge der Fehler nicht (zumindest denke ich nicht). Sei also vorsichtig, wenn das für dich wichtig ist. –