比的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或數據樣本,**請**在文本編輯器中突出顯示這些行,然後單擊編輯器工具欄上的「代碼樣本」按鈕(「{}」)以精確地格式化和語法突出顯示它! (並且沒有雜亂的' '和'
'需要,要麼!!) –