Kurusu
Kurusu

Reputation: 197

SQL Query To Flip The Values And Make It A Field In A New Table

I have this table below

enter image description here

How do I make the output like this

enter image description here

I did the output above using this query:

SELECT DISTINCT 
    C.RefVal, 
    C.CalibrationEventID, 
    C1.Result As "Trial One", 
    C2.Result AS "Trial Two", 
    C3.Result AS "Trial Three", 
    C4.Result AS "Trial Four", 
    C5.Result AS "Trial Five" 
FROM CalibrationTrials AS C 
INNER JOIN 
    (SELECT DISTINCT RefVal, Result FROM CalibrationTrials WHERE CalibrationEventID = 'CAL000001' AND RefVal = '1.0010'AND TrialNo = 1) As C1 
ON C1.RefVal = C.RefVal
INNER JOIN 
    (SELECT DISTINCT RefVal, Result FROM CalibrationTrials WHERE CalibrationEventID = 'CAL000001' AND RefVal = '1.0010'AND TrialNo = 2) As C2 
ON C2.RefVal = C.RefVal
INNER JOIN 
    (SELECT DISTINCT RefVal, Result FROM CalibrationTrials WHERE CalibrationEventID = 'CAL000001' AND RefVal = '1.0010'AND TrialNo = 3) As C3 
ON C3.RefVal = C.RefVal
INNER JOIN 
    (SELECT DISTINCT RefVal, Result FROM CalibrationTrials WHERE CalibrationEventID = 'CAL000001' AND RefVal = '1.0010'AND TrialNo = 4) As C4 
ON C4.RefVal = C.RefVal
INNER JOIN 
    (SELECT DISTINCT RefVal, Result FROM CalibrationTrials WHERE CalibrationEventID = 'CAL000001' AND RefVal = '1.0010'AND TrialNo = 5) As C5 
ON C5.RefVal = C.RefVal

WHERE C.CalibrationEventID = 'CAL000001' AND C.RefVal = '1.0010'
ORDER BY C.RefVal, C.CalibrationEventID

Apparently with this query the output is only fixed to one RefVal which is '1.0010'

What would be the correct query to output image2 format for each RefVal of a CalibrationEventID?

Upvotes: 3

Views: 676

Answers (1)

Andriy M
Andriy M

Reputation: 77707

Here's how you can use a PIVOT clause for your query:

SELECT
  RefVal,
  CalibrationEventID,
  [1] AS [Trial One],
  [2] AS [Trial Two],
  [3] AS [Trial Three],
  [4] AS [Trial Four],
  [5] AS [Trial Five],
  [6] AS [Trial Six]
FROM CalibrationTrials
PIVOT (
  MAX(Result) FOR TrialNo IN ([1], [2], [3], [4], [5], [6])
) AS p

The above assumes that your table consists only of columns RefVal, CalibrationEventID, TrialNo, Result. If there are more columns in the table, you should first select these four separately, then apply PIVOT. Here:

SELECT
  RefVal,
  CalibrationEventID,
  [1] AS [Trial One],
  [2] AS [Trial Two],
  [3] AS [Trial Three],
  [4] AS [Trial Four],
  [5] AS [Trial Five],
  [6] AS [Trial Six]
FROM (
  SELECT
    RefVal,
    CalibrationEventID,
    TrialNo,
    Result
  FROM CalibrationTrials
) AS c
PIVOT (
  MAX(Result) FOR TrialNo IN ([1], [2], [3], [4], [5], [6])
) AS p

This is needed because a PIVOT query is essentially a special case GROUP BY query. All columns except Result take part in grouping implicitly. That's why you should get rid of those that are not needed in this kind of grouping.

And here's an alternative approach, without PIVOT:

SELECT
  RefVal,
  CalibrationEventID,
  MAX(CASE TrialNo WHEN 1 THEN Result END) AS [Trial One],
  MAX(CASE TrialNo WHEN 2 THEN Result END) AS [Trial Two],
  MAX(CASE TrialNo WHEN 3 THEN Result END) AS [Trial Three],
  MAX(CASE TrialNo WHEN 4 THEN Result END) AS [Trial Four],
  MAX(CASE TrialNo WHEN 5 THEN Result END) AS [Trial Five],
  MAX(CASE TrialNo WHEN 6 THEN Result END) AS [Trial Six]
FROM CalibrationTrials
GROUP BY
  RefVal,
  CalibrationEventID

Upvotes: 2

Related Questions