This is my original table:
And I would like it to be as:
CityID | 1 | 2 | 3 | 4 | 5 | 6 | 7 _____________________________________ 1024 0800 0900 and so on...
Here is my code, but I get a syntax error near FOR.
select * from (select SIDURI as CityID, DAY as ArrivalDay, T_FROM as TimeArrival from RNFIL488) as timingTable pivot( timing.SIDURI as CityID timingTable.T_FROM as TimeArrival for timing.DAY as ArrivalDay in ( [1], [2], [3], [4], [5], [6], [7] ) ) as pivot_table
Advertisement
Answer
Use ROW_NUMBER here:
WITH cte AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY CityID ORDER BY ArrivalDay) rn
FROM RNFIL488
)
SELECT
CityID,
MAX(CASE WHEN rn = 1 THEN TimeArrival END) AS [1],
MAX(CASE WHEN rn = 2 THEN TimeArrival END) AS [2],
MAX(CASE WHEN rn = 3 THEN TimeArrival END) AS [3],
MAX(CASE WHEN rn = 4 THEN TimeArrival END) AS [4],
MAX(CASE WHEN rn = 5 THEN TimeArrival END) AS [5],
MAX(CASE WHEN rn = 6 THEN TimeArrival END) AS [6],
MAX(CASE WHEN rn = 7 THEN TimeArrival END) AS [7]
FROM cte
GROUP BY
CityID;
This assumes that your original source table would always have 7 arrival days per city. If not, then we might have to use a calendar table to bring in the missing data. Also, I am avoiding the PIVOT operator, because often the above approach performs better (and I also find it much easier to read).