3

I have a table:

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

What i want:

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

I don't know how many ErrorType there is, so they should be created dynamically based on the distinct values in Error column....Is that possible?

Joe Doe
  • 159
  • 1
  • 8

2 Answers2

0

Try this 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

Result

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

Demo :http://rextester.com/TYYX56571

Sreenu131
  • 2,476
  • 1
  • 7
  • 18
0

You have to do it with dynamic query. it is first necessary to prepare the result set.

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

Result:

ID          A           B
----------- ----------- -----------
1           2           1
neer
  • 4,031
  • 6
  • 20
  • 34