Как отключить из таблицы в Oracle SQL - PullRequest
0 голосов
/ 03 июня 2019

У меня есть 1-5 плит для прогрессивной скидки. Плиты могут варьироваться от одной транзакции к другой. Я хочу сохранить все пять значений в 5 переменных.

Мой стол такой.

enter image description here

Ожидаемые значения такие же

enter image description here

Пример: 2

Если мой стол такой

enter image description here

Ожидаемые значения такие же

enter image description here

* +1032 * Пример: 3

Если мой стол такой

enter image description here

Ожидаемые значения таковы

enter image description here

Также может быть только одна или две плиты.

Заранее спасибо

1 Ответ

1 голос
/ 03 июня 2019

Это много столбцов, а не разворот:

--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.

Столбцы с префиксом, а не с суффиксом, но так делает сводка. и они не в порядке всех плит сначала следуют все скидки; но опять же; вот как это делает пивот; но порядок и название столбцов, я думаю, не имеет значения, если данные верны и повторяемы.

Но я все еще бьюсь над тем, зачем нужны эти опорные точки. У вас есть данные, необходимые в нормализованной таблице на основе строк, извлеките итерацию данных, хотя и в приложении, и представьте ее, я не знаю, зачем нам нужна данные для поворота.

...