MS SQl根据行中的值创建列

时间:2018-05-30 12:06:05

标签: sql-server

我有一张桌子:

   --ID----ID2----Error
      1     1      A
      1     2      B
      1     3      A

我想要的是什么:

 ---ID---ErrorTypeA---ErrorTypeB---
    1         2            1

我不知道有多少ErrorType,所以它们应该根据Error列中的不同值动态创建....这可能吗?

2 个答案:

答案 0 :(得分:0)

试试这个Pivot

DECLARE @Temp AS TABLE (ID INT,ID2 INT,Error CHAR(2))
INSERT INTO @Temp
SELECT 1,1,'A' UNION ALL
SELECT 1,2,'B' UNION ALL
SELECT 1,3,'A' 

SELECT  Id,
        MAX([ErrorTypeA]) AS [ErrorTypeA],
        MAX([ErrorTypeB]) AS [ErrorTypeB]
FROM
(
SELECT *, 'ErrorType'+Error As ErrorCol FROM @Temp
) AS SRc
PIVOT
(
COUNT(ID2) FOR ErrorCol IN ([ErrorTypeA],[ErrorTypeB] )
)
AS PVT
GROUP BY Id

结果

Id  ErrorTypeA  ErrorTypeB
--------------------------
1       2           1

演示:http://rextester.com/TYYX56571

答案 1 :(得分:0)

您必须使用动态查询。首先需要准备结果集。

CREATE TABLE #Tbl (ID INT, ID2 INT, ERROR VARCHAR)
INSERT INTO #Tbl
VALUES
(1, 1, 'A'),
(1, 2, 'B'),
(1, 3, 'A')

DECLARE @ErrorTags NVARCHAR(MAX) = ''
SELECT @ErrorTags += CONCAT(',[', ERROR, ']') FROM  #Tbl GROUP BY ERROR

DECLARE @Query AS  NVARCHAR(MAX) = '
SELECT *
FROM 
(   
    SELECT 
        ID,
        ERROR,
        COUNT(1) CountOfError
    FROM 
        #Tbl
    GROUP BY ID,ERROR
) SRC
PIVOT (
  AVG(CountOfError)
  FOR ERROR IN ('+ STUFF(@ErrorTags, 1, 1, '') +')
) PIV '

execute sp_executesql @Query

结果:

ID          A           B
----------- ----------- -----------
1           2           1
相关问题