Skip to content
Advertisement

All records with Pivot table

I have table as below after pivoting,

Order_ID   Report1_ID Report2_ID Report3_ID 
Order_1   OR_1        null        null   
Order_2   null        OR_2        null   
Order_3   null        null        OR_3     
Order_4   OR_4        null        null   
Order_5   null        OR_5        null   
Order_6   null        null        OR_6    
Order_7   OR_7        null        null  
Order_8   null        OR_8        null   
Order_9   null        null        OR_9

I need like,

Serial_NO  Report1_ID Report2_ID Report3_ID   
1          OR_1        OR_2       OR_3
2         OR_4        OR_5       OR_6
3         OR_7        OR_8       OR_9

I need to remove all the null values and list like above table. My Query as below,

SELECT *
FROM   (
  select 
  ORDER_ID, 
 'Report' + cast((dense_rank() OVER (  ORDER BY order_number) - 1) % 3 + 1) as varchar)) + '_ID' ORDER_S_NO 
  from OrderTable
)main

PIVOT ( max(ORDER_ID) FOR ORDER_S_NO IN (Report1_ID,Report2_ID,Report3_ID) ) AS pivotTable;

Thanks in advance.

Advertisement

Answer

Rather than using the modulus three, you should be using the remainder with a divisor of three. But I would avoid PIVOT here and just use a regular aggregation:

WITH cte AS (
    SELECT t.*, ROW_NUMBER() OVER (ORDER BY order_number) rn
    FROM yourTable t
)

SELECT ROW_NUMBER() OVER (ORDER BY (rn - 1) / 3) AS Serial_NO,
       MAX(Report1_ID) AS Report1_ID,
       MAX(Report2_ID) AS Report2_ID,
       MAX(Report3_ID) AS Report3_ID
FROM cte
GROUP BY (rn - 1) / 3
ORDER BY (rn - 1) / 3;

Here is a demo showing that the above query is working. Note that in the demo I don’t have an actual order_number column, but instead just used ORDER_ID. Coincidentally, this works fine, but would not work for more than 9 records, as text numbers don’t sort the same way as actual numbers.

User contributions licensed under: CC BY-SA
6 People found this is helpful
Advertisement