MySQL - Generowanie odstępów w wynikach wyszukiwania

0

Cześć,

Mam prostą tabelą z 4 kolumnami (NR_ZAMOWIENIA, ILOSC, B, H). W poleceniu SELECT sortuje ją względem ILOSC'i (INT), długości B (INT) oraz NR_ZAMOWIENIA (VARCHAR). W kolumnie ILOSC wartości mogą być bardzo różne (od 1 do 10 nawet), tylko że końcowo chciałbym, aby wynik polecenia SELECT wygenerował przerwę po 4 wierszu (niech to będzie pusty wiersz nawet albo jakiś ciąg znaków, np myślniki). Innymi słowy aby wyniki wyświetlały się grupach co 4 wiersze (z odstępami pomiędzy).
Czy da się to jakoś technicznie wykonać ?

1

heh - takie rzeczy to sie robi po stronie aplikacji nie w bazie danych ... ale taa da się technicznie coś takiego zrobić :)

Np tak:

WITH CTE as 
(SELECT NR_ZAMOWIENIA, ILOSC, B, H,
ROW_NUMBER() OVER (ORDER BY ILOSC, B, NR_ZAMOWIENIA) RN
FROM tabela)

SELECT CASE WHEN RN % 4 = 0 THEN '-------'
        	ELSE NR_ZAMOWIENIA
      	END NR_ZAMOWIENIA
       ,CASE WHEN RN % 4 = 0 THEN '-------'
           	ELSE ILOSC
         END ILOSC
       ,CASE WHEN RN % 4 = 0 THEN '-------'
          	ELSE B
        END B
       ,CASE WHEN RN % 4 = 0 THEN '-------'
          	ELSE H
        END H
FROM CTE 

Ale powtarzam ... to raczej jako ciekawostka - tak się nie robi :]

0

@BlackBad: Hej, wielkie dzięki. Sprawdziłem i działa dokładnie tak jak chciałem. Ale tutaj rodzi się pytanie: czy da się jeszcze rozbić dodatkowo kolumnę ILOSC w taki sposób aby np jeśli ILOSC =10 to można podzielić ją np po 4 czyli z pojedynczego rekordu zrobić trzy ? (ILOSC 4, kolejny wiersz z ILOSC 4 i ostatni ILOSC 2) ? W przypadku oczywiście, gdzie NR_ZAMOWIENIA oraz kolumny B i H są dokładnie takie same ?

0

Nie łapię co chcesz osiągnąć - jaki ma być rezultat. Wstaw przykładowe dane na wejściu, i końcowy efekt jaki byś chciał osiągnąć to się zobaczy. Ale póki co mi to wygląda na jakaś straszną rzeźbę :|

0

Ok, więc tak wygląda tabela wejściowa:screenshot-20220208175427.png

Każdy nr zlecenia po sortowaniu względem ilości oraz długości B ma być docelowo umieszczony w paczkach po 4 sztuki (stąd pytałem wpierw o te odstępy między rekordami). Póki co po segregowaniu muszę to rozdzielać ręcznie na wydruku w PDFie (i rzeźbić :) ). Nie wiem wiec czy to technicznie wykonalne np rekord wsadowy dla ilości np 10 dałoby się rozbić na 3 wiersze po: dwa razy 4, i raz 2. Przy czym te ostatnie 2 tworzyłyby kolejną paczkę z kolejnym nr zlecenia, po sortowaniu względem ilości i B :). Długość B ma tu znaczenie, gdyż elementy w paczce muszą mieć jak najbardziej zbliżoną do siebie długość.

A tak ma to mniej więcej wyglądać końcowo:
screenshot-20220208181751.png

Nie wiem czy wystarczająco jasno to wszystko opisałem :)

Pzdr i z góry już wielkie dzięki za pomoc @BlackBad

1

Szczerze przyznam, że nie mam pomysłu - a i czasu też nie bardzo. Jak mi coś wpadnie do głowy to napisze ale większe szanse, że ktoś inny może coś podobnego kiedyś potrzebował i podsunie jakiś pomysł.

0

Jak dokładnie baza i wersja, podaj przykładowe dane w postaci sql-a

0

@Panczo: Baza danych jest prowadzona w phpMyAdmin, w załączniku wrzucam eksport z bazy (spakowany w ZIP)
tabela.zip

0

fajnie, że jest prowadzona w phpmyadmin, tylko to nic mi nie mówi, napisz co masz głównej stronie w phpmyadmin w karcie serwer bazy danych -> wersja serwera,

Lub wynik zapytania

SELECT VERSION();
0

@Panczo: 10.4.21-MariaDB

0

To najprościej rozbić każde zamówienie na tyle pozycji ile jest w ilości, a później policzyć czwórki i pogrupować:

-- Tworzymy "tabele" z liczbami od 1 do 10
with il (i) as (
	values(1),(2),(3),(4),(5),(6),(7),(8),(9),(10)
),
r as (
select
	-- numer paczki czyli wartość całkowita z dzielenia lp-1 przez 4
	(row_number() over (order by b,h, nr_zlecenia) - 1)  div 4 paczka
	,nr_zlecenia
	,b
	,h 
from 
	week7_skdn w
	inner join  il on w.ilosc >= il.i
)

select 
	paczka
    ,nr_zlecenia
    , count(*) ilosc
    ,b
    ,h 
from 
	r
group by 
	paczka
    ,nr_zlecenia
    ,b
    ,h
order by 
	paczka

Wynik:

screenshot-20220209160609.png

0

Ok niezle to wyglada. Tylko sortowanie powinno uwzgledniac malejąca dlugosc B - aby wymiary byly zblizone. Dzis wieczorem przetestuje u siebie te polecenie.

3

Akurat ustawiłem prządek rosnący, dla malejącego trzeba zmienić sort:

-- Tworzymy "tabele" z liczbami od 1 do 10
with il (i) as (
	values(1),(2),(3),(4),(5),(6),(7),(8),(9),(10)
),
r as (
select
	-- numer paczki czyli wartość całkowita z dzielenia lp-1 przez 4
	(row_number() over (order by b desc,h desc, nr_zlecenia) - 1)  div 4 paczka
	,nr_zlecenia
	,b
	,h 
from 
	week7_skdn w
	inner join  il on w.ilosc >= il.i
)

select 
	paczka
    ,nr_zlecenia
    , count(*) ilosc
    ,b
    ,h 
from 
	r
group by 
	paczka
    ,nr_zlecenia
    ,b
    ,h
order by 
	paczka, b desc,h desc
0

@Panczo: Polecenie działa i to bardzo dobrze. Bedę jeszcze testował na podobnych plikach, gdzie ilość się zmienia. Zastanawiam się jak zrobić naliczanie paczek nie od 0 a od 1.
Ale całościowo wielkie dzięki! Polecenie jest bardzo złożone, w życiu bym do takiej postaci nie doszedł.

1

Zastanawiam się jak zrobić naliczanie paczek nie od 0 a od 1.

w select wpisz paczka+1

0

@Panczo: I jeszcze kwestia techniczna zwiaza z iloscia. W przykladzie powyzej maksymalna ilosc do rozbcia na paczki 'po cztery' to 10.
Czy moge wykorzystywac pomocnicza tabele w takiej postaci jaka stworzyles kiedy liczba bedzie wynoscil max powiedzmy 6 ?
Czy musze usunac z il wartosci od 7 do 10 ?
Bo pliki wsadowe ze zleceniami dostaje rozne - czasem sa po 4 sztuki tego samego, raz po 2 a czesto i po 8 lub 10.
Pzdr.

1

Nie musisz usuwać, ważne abyś miał liczby od 1 do maksymalnej wartości w ilosci.

0

@Panczo: W ten weekend przetestowałem Twoje polecenie na wielu przykładach. Trochę go dostosowałem do swoich potrzeb, ale i tak działa rewelacyjnie!. Oto właśnie mi chodziło.
Próbowałem stworzyć DB ale nie dla siebie tylko dla teścia, który cały ten podział i sortowanie robił ręcznie, przepisując każdy rekord do czystego arkusza na wydruku. I zajmowało mu to całe godziny.
Ja mu przygotowałem proste polecenie, które tylko sortowało rekordy ale nie dzieliło na 4 czy 5 elementów na paczki.
Raz jeszcze, dzięki za pomoc - dla mnie to ciekawe doświadczenie (bo mam jakieś tam podstawy SQLa, ale ciągle się uczę) a dla teścia to chyba ratunek przed załamaniem nerwowym przed emerytura! :)

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