2010-04-23 6 views

ответ

1

Это немного грязно, но вот оно.

Прежде всего, я использую функцию rank(), чтобы знать положение (1,2 или 3) ErrorField. Со всем этим я использую это число для Pivot. Вам нужно два шарнира и соединение между ними.

WITH AuxTable (Data_Error_Key, ErrorField, ErrorValue, NumeroError) 
AS 
(
SELECT Data_Error_Key, ErrorField, ErrorValue, RANK() OVER (PARTITION BY Data_Error_Key ORDER BY Data_Error_Key, ErrorField) 
FROM dbo.TempTable 
) 
SELECT TablaErrorField.Data_Error_Key, ErrorField1, ErrorValue1,ErrorField2,ErrorValue2, ErrorField3, 
     ErrorValue3 
FROM 
(
    SELECT Data_Error_Key, [1] as ErrorField1, [2] as ErrorField2, [3] as ErrorField3 
    FROM (
    SELECT Data_Error_Key,NumeroError, ErrorField 
    FROM AuxTable) P 
    PIVOT 
    (
    MAX (ErrorField) 
    FOR NumeroError IN ([1], [2], [3]) 
    ) AS pvt) As TablaErrorField 
INNER JOIN 
(
    SELECT Data_Error_Key, [1] as ErrorValue1, [2] as ErrorValue2, [3] as ErrorValue3 
    FROM (
    SELECT Data_Error_Key,NumeroError, ErrorValue 
    FROM AuxTable) P 
    PIVOT 
    (
    MAX (ErrorValue) 
    FOR NumeroError IN ([1], [2], [3]) 
    ) AS pvt) as TablaErrorValue 
ON TablaErrorField.Data_Error_Key= TablaErrorValue.Data_Error_Key 

Все это предполагает, что вам нужно всего 3 пары ErrorField/ErrorValue. В противном случае вы должны взглянуть на мой ответ в вопросе this.

1

Я не знаю, если вы можете сделать это с функция PIVOT SQL Server. Эта функция всегда предполагает и требует какой-то агрегатной функции (COUNT, AVG) для числового значения - вы не можете просто переносить строки в столбцы.

В вашем случае, если вы знаете, ваши поля ошибок заранее, вы могли бы сделать что-то вроде этого:

SELECT 
    ErrorKey, 
    [Field1] AS Field1, [Field2] AS Field2, [Field10] AS Field10, 
    [Field11] AS Field11, [Field13] as Field13, [Field14] as Field14, 
    [Field15] as Field15, [Field21] as field21 
FROM 
    (SELECT ErrorKey, ErrorField, ErrorValue 
    FROM Errors) e 
PIVOT 
(
COUNT (ErrorValue) 
FOR ErrorField IN 
    ([Field1], [Field2], [Field10], [Field11], [Field13], 
     [Field14], [Field15], [Field21]) 
) AS pvt 
ORDER BY pvt.ErrorKey 

Это будет производить выходной что-то вроде этого:

ErrorKey Field1 Field2 Field10 Field11 Field13 Field14 Field15 field21 
    1   1  1  1  0  0  0  0  0 
    2   0  0  0  1  1  1  0  0 
    3   0  0  0  0  0  0  1  1 

Это дало бы вы подсчитываете ошибку в конкретном поле для каждого ключа ошибки.