比的Mikael是一个涉及多一点 - 的主要区别是,列在这里保持(但是列比第一个“排队”等每个错误代码)。
设置:
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
有行对于任何给定的写到FileID一个最大数量? ErrorCodes的列表是已知的并且是有限的吗?如果有两个错误12,你需要分别报告他们两个吗?无论如何,我建议这个崩溃会在表现层处理得更好。 –
根据错误总数将会有最大行数。在这种情况下,有50个错误,每个FileID最多有50个条目。所有错误代码在每个给定文件中都是唯一的。所以一个FileID只会列出每个错误代码一次。 – buzzzzjay
如果您发布代码,XML或数据样本,**请**在文本编辑器中突出显示这些行,然后单击编辑器工具栏上的“代码样本”按钮(“{}”)以精确地格式化和语法突出显示它! (并且没有杂乱的' '和'
'需要,要么!!) –