Не знаю, верна ли формулировка вопроса, но я хочу сделать следующее:

У меня есть таблица с названием продажи . Она содержит следующие столбцы:

    ------------------------------------------------
    | PRODUCT_NAME | PRODUCT_QUANTITY | ExpierDate |
    ------------------------------------------------

Если I SELECT * FROM sales, то результат будет:

------------------------------------------------
| PRODUCT_NAME | PRODUCT_QUANTITY | ExpierDate |
------------------------------------------------
| TestName     |        5         | 2021-6-12  |
| TestName     |        2         | 2024-10-18 |
------------------------------------------------

Что мне нужно сделать, так это выбрать запрос и получить следующий результат:

    ------------------------------------------------
    | PRODUCT_NAME | PRODUCT_QUANTITY | ExpierDate |
    ------------------------------------------------
    | TestName     |        1        | 2021-6-12   |
    | TestName     |        2        | 2021-6-12   |
    | TestName     |        3        | 2021-6-12   |
    | TestName     |        4        | 2021-6-12   |
    | TestName     |        5        | 2021-6-12   |
    | TestName     |        1        | 2024-10-18  |
    | TestName     |        2        | 2024-10-18  |
    ------------------------------------------------

Это вообще возможно?

Как я могу это сделать..!?

1
Adeeb Mark 3 Фев 2021 в 12:45

2 ответа

Лучший ответ

Я бы рекомендовал напрямую использовать рекурсивный CTE:

with recursive cte as (
      select product_name, product_quantity, expire_date, 1 as n
      from sales s
      union all
      select product_name, product_quantity, expire_date, n + 1
      from cte
      where n < product_quantity
     )
select *
from cte
order by product_name, product_quantity, expire_date, n;

Вот скрипка db <>.

0
Gordon Linoff 3 Фев 2021 в 12:24

Как я упоминал в комментарии, с помощью cte создать псевдоданные для заполнения строки очень просто:

with RECURSIVE quan(quantity) AS (
 SELECT 1 
 UNION ALL
 SELECT quantity+1 FROM quan WHERE quantity < 10 --you may have to increase this
)
SELECT tb.PRODUCT_NAME ,quan.quantity as PRODUCT_QUANTITY,tb.ExpierDate 
  FROM [tb]  -- your result table
  JOIN quan on tb.PRODUCT_QUANTITY >= quan.quantity
 ORDER BY tb.time,quan.quantity

Вот db <> fiddle с псевдоданными.
используя столбец int как столбец time в псевдоданных, но я думаю, что сам запрос все равно будет работать.
В рекурсивном cte вам, возможно, придется увеличить часть where, чтобы создать больше данных псевдо-количества, в зависимости от вашего максимального количества.

0
T. Peter 3 Фев 2021 в 10:19
66024900