Zapytanie sql, które rozłoży wartość liczbową na mniejsze

0

Mam takie dane:

rok    nr  ilość
2020, 10, 120;
2020, 20, 150;
2020, 30, 250;
2020, 40, 320;

Chciałbym rozłożyć to na ilość maksymalnie np. 120. Żeby to wyglądało np. tak:

rok       nr    ilość    lp
2020,     10,     120,    1;
2020,     20,     120,    2;
2020,     20,      30,    3;
2020,     30,      90,    3;
2020,     30,     120,    4;
2020,     30,      40,    5;
2020,     40,      80,    5;
2020,     40,     120,    6;
2020,     40,     120,    7;

Lp jest zawsze dopełniane tak, żeby każde zawierało maksymalnie 120.

Ja dostałem jakiegoś zaciemnienia i nie wychodzi mi jakoś podzielenie tego.

2

jeśli zwracanych rekordów ma być więcej niż wejściowych i nie bardzo jest z czym to połączyć to jedyne sensowne wydaje się być napisanie stored proc do tego

2

Wybrałbym procedurę dla przejrzystości. Dla rozrywki próba w sqlu postgresowym. To że się da nie oznacza, że warto.

Dane testowe:

create table foo (rok int, nr int, ilosc int);

insert into foo values
(2020, 10, 120),(2020, 20, 150),(2020, 30, 250),(2020, 40, 320);

Queras:

with rozmiar_paczki as (select 200  as r)
select
  rok
  ,nr
  ,case
    when row_number() over (partition by rok,nr order by s) = count(0) over (partition by rok,nr )  then ilosc - r*(count(0) over (partition by rok,nr ) - 1)
    else r
  end 
  ilosc 
  ,row_number() over (partition by rok,nr order by s) lp
  ,x.ilosc ilosc_oryginalna
from (select rp.r, s,f.* from foo f, rozmiar_paczki rp, generate_series(1,f.ilosc,rp.r) s) x
;
0

Udało się załatwić to używając WHILE

0

Nie jestem biegły w postgresie, więc tutaj kluczowe zapytanie w MS SQL:

WITH groupsCount AS (
  SELECT MAX((ilosc - 1) /120 + 1) AS totalGroupsCount
  FROM samples
), numbers AS (
  SELECT 1 AS num
  UNION ALL
  SELECT num + 1 FROM numbers WHERE num + 1 <= (SELECT totalGroupsCount FROM groupsCount)
), groups AS (
  SELECT rok, 
    nr,
    CASE
      WHEN ilosc >= N.num * 120 THEN 120
      WHEN ilosc >= (N.num - 1) * 120 THEN ilosc % 120
      ELSE 0
    END as ilosc
  FROM samples AS S
  CROSS JOIN numbers AS N
)
SELECT * FROM groups WHERE ilosc > 0 ORDER BY rok, nr, ilosc DESC

http://sqlfiddle.com/#!18/0c67b/8

Liczbę porządkową i przetłumaczenie na postgresa zostawiam już Tobie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1