TSQL, объединяющий несколько строк в одну строку - PullRequest
0 голосов
/ 16 сентября 2011

Я пытаюсь создать запрос для объединения следующей информации:

FileID  ErrorCode  ErrorDesc             ErrorCount
  1         4      Bad File Name             3
  2         6      Bad File Code            56
  3         4      Bad File Name             2
  3        12      Line Length Invalid       3
  3        17      Missing Req Fields      150

Я хочу объединить все строки на основе FileID, чтобы вся информация для данного FileID отображалась ната же строка, что и следующая:

1  4  Bad File Name     3
2  6  Bad File Code    56
3  4  Bad File Name     2     12  Line Length Invalid  3     17 Missing Req Fields  150

Проблема, с которой я ее запускаю, будет иметь неизвестное количество ошибок для каждого файла.Может быть 1-50 ошибок, и я хотел бы объединить всю эту информацию в одну строку.Я не уверен, возможно ли это или есть другой способ взглянуть на эту проблему.Моя конечная цель - создать отчет на основе этих данных.Спасибо!

Ответы [ 2 ]

5 голосов
/ 16 сентября 2011
declare @T table (FileID int, ErrorCode int, ErrorDesc varchar(max), ErrorCount int)

insert into @T values
(1,             4,                    'Bad File Name',          3),
(2,             6,                    'Bad File Code',          56),
(3,             4,                    'Bad File Name',          2),
(3,             12,                   'Line Length Invalid',    3),
(3,             17,                   'Missing Req Fields',     150)

select FileID,
       (select cast(ErrorCode as varchar(10))+' '+ErrorDesc+' '+cast(ErrorCount as varchar(10))+' '
        from @T as T2
        where T1.FileID = T2.FileID
        for xml path(''), type).value('.', 'varchar(max)') 
from @T as T1
group by FileID
3 голосов
/ 16 сентября 2011

Немного сложнее, чем у Микаэля - главное отличие состоит в том, что здесь поддерживаются столбцы (однако столбцы для каждого кода ошибки, кроме первой «строки»).

Установка:

CREATE TABLE dbo.t
(
    FileID INT,
    ErrorCode INT,
    ErrorDesc VARCHAR(255),
    ErrorCount INT
);

INSERT dbo.t VALUES
(1,4,'Bad File Name',3),
(2,6,'Bad File Code',56),
(3,4,'Bad File Name',2),
(3,12,'Line Length Invalid',3),
(3,17,'Missing Req Fields',150);

Код:

DECLARE 
    @sql0 NVARCHAR(MAX) = N'',
    @sql1 NVARCHAR(MAX) = N'',
    @sql2 NVARCHAR(MAX) = N'',
    @minC INT;

SELECT @minC = MIN(ErrorCode) FROM dbo.t;

SELECT @sql1 += REPLACE(',x$.ErrorCode AS Code$,
    x$.ErrorDesc AS Desc$,x$.ErrorCount AS Count$', 
    '$', CONVERT(VARCHAR(12), ErrorCode))
    FROM dbo.t WHERE ErrorCode > @minC GROUP BY ErrorCode ORDER BY ErrorCode;

SELECT @sql2 += REPLACE(' 
    LEFT OUTER JOIN x AS x$ ON z.FileID = x$.FileID 
    AND x$.ErrorCode = $
    AND x$.ErrorCode > z.ErrorCode', '$', CONVERT(VARCHAR(12), ErrorCode))
    FROM dbo.t WHERE ErrorCode > @minC GROUP BY ErrorCode ORDER BY ErrorCode;

SET @sql0 = ';WITH y AS (
    SELECT FileID, ErrorCode, ErrorDesc, ErrorCount,
        rn = ROW_NUMBER() OVER (PARTITION BY FileID ORDER BY ErrorCode)
    FROM dbo.t
),
z AS ( SELECT FileID, ErrorCode, ErrorDesc, ErrorCount FROM y WHERE rn = 1 ),
x AS ( SELECT FileID, ErrorCode, ErrorDesc, ErrorCount FROM y WHERE rn > 1 )
SELECT z.*' + @sql1 + ' FROM z
' + @sql2;

-- PRINT @sql0; -- to see what has been crafted    
EXEC sp_executesql @sql0;
GO

Очистка:

DROP TABLE dbo.t;
GO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...