SQLite - zapytanie

0

Witam,

Dopiero zaczynam z programowaniem zapytań i mam problem z poprawnym rozpisaniem poniższego zapytania w SQLite.
Mam tablę (o nazwie np. lipiec_2016) z czterema kolumnami (data, nr_palety, nr_towaru, partia).
W każdym dniu zostało stworzonych wiele palet, każda z różną ilością różnego towaru i partii.
Są np. sytuacje, że na jednej palecie jest jeden towar (nr_towaru) lecz z różnych partii lub kilka różnych towarów lecz z tym samym oznaczeniem partii.
Oznaczenie partii to de facto data ważności zapisana jednym ciągiem 8 cyfr.

Chciałbym sprawdzić ile danego dnia zostało stworzonych palet na których jest np:
a) jeden towar z jedną partią
b) dwa toway z 3 partiami

Lub czy możliwe jest otrzymanie w wyniku zapytania (dla jednego dnia lub całego miesiąca) tabeli, gdzie kolumny (numerowane po kolei) to ilość towaru, a wiersze to ilość partii?
Środek tabeli wypełniony byłby wynikami. W przykładzie wyniku poniżej dla danego okresu mamy 5 palet z 3 towarami i 8 indeksami oraz 8 palet z 1 towarem i 2 partiami.
screenshot-20180314120041.pngtitle

Bardzo dziękuję za wszelkie podpowiedzi.

0

Daj (najlepiej na sqlfiddle) przykładowe dane i napisz oczekiwany wynik.
Ale tak - da się.

0

Dziękuję za zainteresowanie moim problemem.
Próbka danych -> http://sqlfiddle.com/#!7/a1f6c/2
Chciałbym żeby wynik mojego zapytania miał formę tabeli tak jak opisałem wczesniej (oczekiwany wynik z próbki danych):
screenshot-20180315100057.png

0

Generowanie takiego grida zrobiłbym po stronie aplikacji, ale na upartego:

Select
     Partie
     , case when towary = 1 then Palety else '' end as [01]
     , case when towary = 2 then Palety else '' end as [02]
     , case when towary = 3 then Palety else '' end as [03]
     , case when towary = 4 then Palety else '' end as [04]
     , case when towary = 5 then Palety else '' end as [05]
     , case when towary = 6 then Palety else '' end as [06]
     , case when towary = 7 then Palety else '' end as [07]
     , case when towary = 8 then Palety else '' end as [08]
     , case when towary = 9 then Palety else '' end as [09]
     , case when towary = 10 then Palety else '' end as [10]
from (
Select Partie, Towary, count(*) Palety
from (
SELECT nr_palety, count(distinct partia) Partie ,count(distinct towar) Towary FROM Lipiec_2016
group by nr_palety) as d
group by Partie, Towary
) dt

http://sqlfiddle.com/#!5/a1f6c/12

0

Dziękuję bardzo!
Jeszcze nie do końca rozumiem dokładnie treści zapytania do bazy ale analizuje z podręcznikiem w ręku ;)

Chciałbym jeszcze podejść do tematu wyznaczania ilości asortymentu na palecie w inny sposób.
Każda unikalna para "TOWAR" i "PARTIA" to w zasadzie odrębny artykuł - np. 2 towary o tym samym kodzie ale innej partii to 2 różne artykuły.
Jak wyglądałoby zapytanie kiedy chcielibyśmy uzyskac informację ile mamy palet z 1, 2, ... 10 artykułami?
Czy należy rozpisac osobne zapytania dla każdej ilości artykułu?

Dla przedstawionej próbki danych ( http://sqlfiddle.com/#!7/a1f6c/2 ) wynik to:
8 palet z 1 artykułem
1 paleta z 5 artykułami
1 paleta z 10 artykułami
1 paleta z 11 artykułami

0

Łatwiej na kliencie

0

Zacznij od tego:

Select count(*) Palety, Towary
from (
SELECT nr_palety ,count(distinct towar+partia) Towary FROM Lipiec_2016
group by nr_palety) as d
group by Towary

Wg. Próbki danych, która dajesz, żadna paleta nie ma 10 artykułów

0

Pablo - wynik z twojego zapytania wyglądta tak:
screenshot-20180315134836.png

Wg moje liczenia "z palca", powinno to wyglądac tak:
8 palet z 1 artykułem
1 paleta z 5 artykułami
1 paleta z 6 artykułami
1 paleta z 10 artykułami
1 paleta z 11 artykułami

Patrząc gołym okiem na dane w tabeli pierwsza paleta (25113122) ma 10 unikatowych part "towar"+"partia".
Ta pierwsza paleta ma towaty z 4 różnymi partiami - i chyba twoje zapytanie podaje ilość partii jakie występują dla danej palety, a nie ilość unikatowych połączeń "towar"+"partia".

0

no widzisz policzyłeś z palca i wyszło inaczej niż w pierwotnej wersji, błąd jest tutaj:

zamień COUNT(DISTINCT towar + partia) na COUNT(DISTINCT towar||partia)

0

Dzięki bardzo :)
Generalnie chyba wszystko rozumiem oprócz linijki:

GROUP BY nr_palety) AS d>
a właściwie samej końcówki > AS d>
ale to jeszcze gdzieś doczytam.
Dzięki bardzo jeszcze raz!

0

Tu nie ma czego rozumieć d to alias dla podzapytania

podzapytanie wyglada tak:


SELECT nr_palety ,COUNT(DISTINCT towar+partia) Towary FROM Lipiec_2016
GROUP BY nr_palety

my budujemy tak:

SELECT 
    COUNT(*) Palety
    , Towary
FROM 
     (podzapytanie) AS d
GROUP BY 
     Towary

i d to nazwa dla podzapytanie ktore jest wpisywane w nawiasach, jakby sformatować zapis inaczej to będzie czytelniej:

SELECT COUNT(*) Palety,
       Towary
FROM
    (
	   SELECT nr_palety,
			COUNT(DISTINCT towar + partia) Towary
	   FROM Lipiec_2016
	   GROUP BY nr_palety
    ) AS d
GROUP BY Towary;

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