2017-10-23 5 views
2

一部のレコードをデータベースにエクスポートする機能があります。エクスポート中にエラーが発生し、データベースにログインしています。結合された列データはSQLクエリ出力として取得する必要があります

これは、ログテーブルのデータです:今、私は次のようにこれらのレコードを表示する必要が

​​

enter image description here

これは、あなたが使用できるSQLクエリですテスト

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

をだからでテキストによってグループが必要一列ですか? –

+0

はい..あなたは正しい –

+0

あなたの写真はサンプルと一致せず、サンプルデータに10行、結果画像に9行あります。行がありませんか? –

答えて

1

あなたのデータに基づいて、ウィンドウ関数と順序付けカラムを用いてグループ化列を取得することができます。

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) 

これは、本質的に、各エラーに4つの列を追加します。データの性質上、特定のエラーが複数の行にアタッチされている可能性があります。

グループは、最初のサブクエリの4つの列で定義されます。 SQL Serverの2017+では

、あなたはその後、集計クエリでこれを置くことができます。以前のバージョンでは

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; 

を、あなたは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

OPの出力に一致しません。 3つのグループのみを作成します。 http://rextester.com/TKOIO30687 –

+0

@JuanCarlosOropeza。 。 。私が最初に思ったよりもはるかに複雑で、すでにかなり複雑だと思っていました。 –

+0

@ SajithA.K。これが正しい結果を出すときでも、エラーの順序は保証されません(少なくとも私はそうではないと思います)。それがあなたにとって重要なのであれば注意してください。 –

関連する問題