在SQL Server中使用PIVOT

时间:2010-04-23 04:50:54

标签: sql sql-server pivot

2 个答案:

答案 0 :(得分:1)

我不知道你是否可以使用SQL Server PIVOT功能。该函数总是假定并且需要对数值赋予某种聚合函数(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

这将为每个错误密钥提供特定字段中的错误计数。

答案 1 :(得分:1)

它有点乱,但现在是。

首先,我使用rank()函数来了解ErrorField的位置(1,2或3)。 尽管如此,我还是将这个数字用于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问题中查看我的回复。