I have set of vehicle parts stored in two tables as per below:
Source Table1:
Vehicle_ID | Part1 | Part2 | Part3 | Part4 | Part5 |
---|---|---|---|---|---|
1 | 10 | 20 | 30 | ||
2 | 10 | 20 | |||
3 | 10 |
Source Table2:
Vehicle_ID | Part6 | Part7 | Part8 | Part9 | Part10 |
---|---|---|---|---|---|
1 | 40 | ||||
2 | 30 | 50 | 60 | ||
3 | 30 |
Required Table like below:
Vehicle_ID | Part1 | Part2 | Part3 | Part4 | Part5 |
---|---|---|---|---|---|
1 | 10 | 20 | 30 | 40 | |
2 | 10 | 20 | 30 | 50 | 60 |
3 | 10 | 30 |
Maximum of the Part column up to 5 only.
I tried Union all statement but that statement is not relevant for excluding blank columns.
Please share your experience to solve my problem .
Advertisement
Answer
You need to unpivot and pivot the rows in both tables.
Data:
SELECT * INTO Table1 FROM (VALUES (1, 10, 20, 30, NULL, NULL), (2, 10, 20, NULL, NULL, NULL), (3, 10, NULL, NULL, NULL, NULL), (4, 40, NULL, NULL, NULL, NULL) ) v (Vehicle_ID, Part1, Part2, Part3, Part4, Part5) SELECT * INTO Table2 FROM (VALUES (1, 40, NULL, NULL, NULL, NULL), (2, 30, 50, 60, NULL, NULL), (3, 30, NULL, NULL, NULL, NULL), (5, 50, NULL, NULL, NULL, NULL) ) v (Vehicle_ID, Part6, Part7, Part8, Part9, Part10)
Statement:
SELECT Vehicle_ID, MAX(CASE WHEN RN = 1 THEN Part END) AS Part1, MAX(CASE WHEN RN = 2 THEN Part END) AS Part2, MAX(CASE WHEN RN = 3 THEN Part END) AS Part3, MAX(CASE WHEN RN = 4 THEN Part END) AS Part4, MAX(CASE WHEN RN = 5 THEN Part END) AS Part5 FROM ( SELECT COALESCE(t1.Vehicle_ID, t2.Vehicle_ID) AS Vehicle_ID, a.*, ROW_NUMBER() OVER (PARTITION BY COALESCE(t1.Vehicle_ID, t2.Vehicle_ID) ORDER BY a.Part_ID) AS RN FROM Table1 t1 FULL OUTER JOIN Table2 t2 ON t1.Vehicle_ID = t2.Vehicle_ID CROSS APPLY (VALUES (1, t1.Part1), (2, t1.Part2), (3, t1.Part3), (4, t1.Part4), (5, t1.Part5), (6, t2.Part6), (7, t2.Part7), (8, t2.Part8), (9, t2.Part9), (10, t2.Part10) ) a (Part_ID, Part) WHERE a.Part IS NOT NULL ) t GROUP BY Vehicle_ID
Result:
Vehicle_ID | Part1 | Part2 | Part3 | Part4 | Part5 |
---|---|---|---|---|---|
1 | 10 | 20 | 30 | 40 | |
2 | 10 | 20 | 30 | 50 | 60 |
3 | 10 | 30 | |||
4 | 40 | ||||
5 | 50 |