Это много столбцов, а не разворот:
--BUILD Sample dataset called MyTable
WITH MyTable as (
SELECT 0 slab_from, 100 slab_to, 1 discount FROM dual union all
SELECT 100 slab_from, 200 slab_to, 5 discount FROM dual union all
SELECT 200 slab_from, 99999999 slab_to, 8 discount FROM dual ),
--Now build a CTE with a row number that we can use to pivot the data.
CTE as (SELECT Slab_from, Discount, row_number() over (Order by slab_FROM) RN
FROM myTable)
--Now build the data set. Though I'm a bit confused why there are 4 slabs and 3 discounts in your expected results...
SELECT * FROM (SELECT * FROM CTE)
PIVOT (
max(slab_from) as SLAB, max(Discount) as Discount --[We could add max(Slab_to) SLABTO] to get the max value for each as well if needed...
for RN in (1,2,3,4,5) --RowNumber values 1-5 since 5 is max according to question
);
Вышесказанное дает нам:
+--------+------------+--------+------------+--------+------------+--------+------------+--------+------------+
| 1_SLAB | 1_DISCOUNT | 2_SLAB | 2_DISCOUNT | 3_SLAB | 3_DISCOUNT | 4_SLAB | 4_DISCOUNT | 5_SLAB | 5_DISCOUNT |
+--------+------------+--------+------------+--------+------------+--------+------------+--------+------------+
| 0 | 1 | 100 | 5 | 200 | 8 | | | | |
+--------+------------+--------+------------+--------+------------+--------+------------+--------+------------+
Если вы хотите, чтобы имена столбцов начинались с 0, просто вычтите 1 из RN в CTE.
Возможный ответ 2: Tweeked: при условии, что все диапазоны перекрытий начинаются с 0 и что 1-5 зарезервированы для фактических строк, которые могут / не могут быть в вашей базовой таблице.
--BUILD Sample dataset called MyTable
WITH MyTable as (
SELECT 0 slab_from, 100 slab_to, 1 discount FROM dual union all
SELECT 100 slab_from, 200 slab_to, 5 discount FROM dual union all
SELECT 200 slab_from, 99999999 slab_to, 8 discount FROM dual),
--Now build a CTE with a row number that we can use to pivot the data.
CTE as (SELECT 0 "0_SLAB", Slab_to, Discount, row_number() over (Order by slab_FROM) RN
FROM myTable)
--Now build the data set. Though I'm a bit confused why there are 4 slabs and 3 discounts in your expected results...
SELECT * FROM (SELECT * FROM CTE)
PIVOT (
max(slab_to) as SLAB, max(Discount) as Discount --[We could add max(Slab_to) SLABTO] to get the max value for each as well if needed...
for RN in (1,2,3,4,5) --RowNumber values 1-5 since 5 is max according to question
);
Единственная разница здесь в том, что я использую slab_to и жестко кодирую 0_SLAB в 0, поэтому все остальные возможные диапазоны изменяются от 1-5.
Столбцы с префиксом, а не с суффиксом, но так делает сводка. и они не в порядке всех плит сначала следуют все скидки; но опять же; вот как это делает пивот; но порядок и название столбцов, я думаю, не имеет значения, если данные верны и повторяемы.
Но я все еще бьюсь над тем, зачем нужны эти опорные точки. У вас есть данные, необходимые в нормализованной таблице на основе строк, извлеките итерацию данных, хотя и в приложении, и представьте ее, я не знаю, зачем нам нужна данные для поворота.