Wpis z mikrobloga

Mam chyba jakieś zaćmienie mózgu bo nie potrafię rozwiązać tego (z pozoru?) prostego problemu:

Potrzebuję napisać zapytanie sql ( baza mssql), które znajdzie wspólne sprzedawane produkty dla 3 hurtowni. Czyli tak:
- interesuje mnie tylko to czy dany produkt był w sprzedaży we wszystkich 3 hurtowniach w danym tygodniu (wystarczy, że był w jakimś dniu w jakimś tygodniu i to się zalicza) - generalnie to sobie ogarnąłem w taki sposob:

Wszystko Mam w jednej tabeli ale stworzyłem w zapytaniu 3 tabele i złączyłem przy użyciu intersect, wygląda to mniej więcej tak:

SELECT
idprodukt
, rok
, nr
tygodniawroku

FROM tabela

WHERE 1=1
AND idhurtownia =1 ------hurtownianr1
AND roktydzien = 202345

GROUP BY to co w selekcie xd

INTERSECT

SELECT
id
produkt
, rok
, nrtygodniawroku

FROM tabela

WHERE 1=1
AND id
hurtownia =2 ------hurtownianr2
AND rok
tydzien = 202345

group by to co w selekcie

+ tam jeszcze jedna tabela dotyczącą produktów trzeciej hurtowni

Niestety rozwiązanie to jest wadliwe bo:
1. Wymagania są takie, że sprawdzam dane od 202345 (rok i tydzien) i od tego okresu biorę produkty, które występują w każdym miesiącu, jak jakiś produkt wystąpi w każdym tygodniu dla każdej hurtowni ale np. oprócz ostatniego pełnego tygodnia to musi zniknąć z zapytania.

Inaczej rzecz ujmując: jeśli wynikiem zapytania będzie jakiś produkt to ma z tego wynikać, że był on w sprzedaży w każdej hurtowni, przynajmniej jeden dzień w każdym tygodniu od okresu 202345

Wynikiem zapytania obecnego, tego co podałem wyzej jest to, że pokaże mi produkty wspolne dla 3 hurtowni w danym roku i tygodniu ale nie sprawdzi czy dany produkt był w sprzedaży każdym tygodniu od wymaganego okresu.

Proszę o jakiekolwiek wskazówki bo mnie #!$%@? strzela xD

#sql #sqlserver #businessintelligence
  • 7
  • Odpowiedz
@D4nielek: Myślę, że łatwiej by było się połapać jakbyś jakiś DDL tabel i query wrzucił na coś pokroju pastebin bo jak sam widzisz mirko się do tego nie nadaje i więcej czasu trzeba by spędzić na odkodowaniu tego co napisałeś, niż pomyśleniu nad odpowiedzią.
  • Odpowiedz
18+

Zawiera treści 18+

Ta treść została oznaczona jako materiał kontrowersyjny lub dla dorosłych.

@D4nielek: powtaje pytanie czy to jednarozowe zapytania czy nie. Ja bym najpierw dla ułatwienia stworzyl trzy #temp dla każdej hurtowni z danego zakresu czasowego, a potem zrobił inner joina dla wszystkich trzech #temp.
No i potencjalnie użył variables dla deklarowania zakresu czasu / lub kolejną tabele z zakresami dat.
W razie czego można wszystko opisać używając subqueries w jednym joinie.
  • Odpowiedz
@D4nielek: no kolego, na stacku by Ci takie pytanie wyebali, ale spróbujmy

robisz dwa CTE - jedno do określenia całkowitej liczby unikalnych tygodni zaczynając od tygodnia 202345, w których była sprzedaż (id hurtowni, unikatowy count tygodni, z filtrem >=202345, zgrupowane bo id hurtowni) - dla każdej hurtowni. Nazwijmy ją Tyg

drugie - ile unikalnych tygodni każdy produkt był dostępny w każdej z hurtowni (idproduktu, nazwaproduktu, idhurtowni, unikatowy count tygodni, zgrupowane po
  • Odpowiedz
  • 1
@Drmscape2 @przecietnyczlowiek @konradpra @peoplearestrange dobra ogarnąłem to, trochę inaczej ale i tak mi pomogliście bo w jakiejś części wykorzystałem to co pisaliście

Zrobiłem zmienna z liczba tygodni od daty co chcialem a potem w zapytaniu głównym Dodatkową kolumnę z użyciem funkcji okna, która mi zwracała w ilu tygodniach od wymaganej daty pojawił się produkt to wszystko dla 3 zapytań pomniejszych bo uzywam INTERSECT dla zwrócenia wspólnych części i na końcu filter gdzie
  • Odpowiedz