Pytanie od początkującego - wybranie danych "nowego" klienta

0

Witajcie,

Przepraszam od razu, ale od jakiego tygodnia dopiero uczę się SQLa, mam dostęp do bazy danych w przedsiębiorstwie,w którym pracuje (oczywiście z ograniczeniami) i zastanawiam się czy można zdefiniować poniższy kod dodając jeszcze jeden warunek, którego ja nie ogarniam, bo za mało wiem:)

select Zamowienie_Numer ,Data_Faktury,Odbiorca_Kod,Odbiorca,Odbiorca_Segment_Nowy_Kod,KOR_Kod,KOR, SUM(Wartosc) AS 'wartosc'
from OLAP_Sprzedaz_View
where Data_Faktury between '2022-09-01' and '2022-09-28' and Odbiorca_Segment_Nowy_Kod in ('III', 'IV') and KOR not in ('KOR E-commerce','KOR - LKAM MR II','KOR - Sieci','KOR - LKAM MR I') 
and not Produkt_Kod='9DA.Z005.01P.0000Z'
group by Zamowienie_Numer, Data_Faktury,Odbiorca_Kod,Odbiorca,Odbiorca_Segment_Nowy_Kod,KOR_Kod,KOR
having sum(Wartosc) between 1 and 300
order by 4

Czyli wyrzuca wszystkie zamówienie od 1 do 300 PLN w danych segmentach sprzedaży w określonym przedziale, które nie mają specyficznego kodu artykułu (dokładnie jest to rodzaj opłaty) w zamówieniu.
Jak dodać warunek, który by sprawdzał, czy zamówienie danego odbiorcy od daty bieżącej pojawiło się pierwszy raz od ostatnich 24 tygodni? (bo jakby tak zdefiniowanego 'nowego klienta' nie chcemy obciążać tą opłatą;)

Mam nadzieję, że w miarę zrozumiale opisałem problem. Możecie też mnie odesłać do literatury-może uda mi się to zrobić samemu, ale czuję, że to trochę bardziej skomplikowane na mój aktualny stan wiedzy:)

Dziękuję z góry. Pozdrawiam.

45

count(*) = 1 and DATEDIFF

Spróbuj coś takiego.

0

Sorka, ja trochę nie ogarniam.
Pomyślałem, że to ma być jakoś tutaj w podzapytaniu, ale średnio wiem jak to dokończyć:)

where Data_Faktury between '2022-09-01' and '2022-09-28' and Odbiorca_Segment_Nowy_Kod in ('III', 'IV') and KOR not in ('KOR E-commerce','KOR - LKAM MR II','KOR - Sieci','KOR - LKAM MR I') 
and not Produkt_Kod='9DA.Z005.01P.0000Z' and not
Zamowienie_Numer=(select count(Data_Faktury)=1 and datediff(day, i co tutaj dalej?:)
0

spróbuj dodać coś a'la takiego:

and not exists (select 1 from OLAP_Sprzedaz_View v2 where v2.Odbiorca = v1.Odbiorca and datediff(now(), v2.data_faktury)  <=  24*7)

czyli:

select Zamowienie_Numer ,Data_Faktury,Odbiorca_Kod,Odbiorca,Odbiorca_Segment_Nowy_Kod,KOR_Kod,KOR, SUM(Wartosc) AS 'wartosc'
from OLAP_Sprzedaz_View v1
where Data_Faktury between '2022-09-01' and '2022-09-28' and Odbiorca_Segment_Nowy_Kod in ('III', 'IV') and KOR not in ('KOR E-commerce','KOR - LKAM MR II','KOR - Sieci','KOR - LKAM MR I') 
and not Produkt_Kod='9DA.Z005.01P.0000Z'

and not exists (select 1 from OLAP_Sprzedaz_View v2 where v2.Odbiorca = v1.Odbiorca and datediff(now(), v2.data_faktury)  <=  24*7)

group by Zamowienie_Numer, Data_Faktury,Odbiorca_Kod,Odbiorca,Odbiorca_Segment_Nowy_Kod,KOR_Kod,KOR
having sum(Wartosc) between 1 and 300
order by 4
0

Mhm bez tego zwraca:

and not exists (select 1 from OLAP_Sprzedaz_View v2 where v2.Odbiorca = v1.Odbiorca and datediff(now(), v2.data_faktury)  <=  24*7)

w 2 sekundy

A z tym kodem mieli już 5 minut, tak ma być?:)

Wynik ok, zmieniłem tylko now na getdate i dodałem day, bo to chyba wymagane jest:

datediff(day, GETDATE(), v2.Data_Faktury)

Ja rozumiem, że ten warunek bierze (1) 'Zamówienie_numer' i sprawdza czy od momentu wprowadzenia zamówienia (Data_faktury) minęły 24 tygodnie i wyklucza te zamówienia z wyniku, tak? Coś nowego każdego dnia:)

0

Ten warunek robi tylko: wyklucza w głównym selekcie rekordy, które dla danego odbiorcy posiadają fakturę z datą, gdzie nie minęło 24tygodnie. Jeżeli jest taki rekord, nie uwzględnia go w tym głównym.

Widzę, że zapytanie jest oparte na widoku, które zbiera informacje nt faktur, odbiorców, etc...

0

Nie chcąc tworzyć nowego wątku, co zrobić by w zapytaniu nie wpisywać dzisiejszej daty i jutrzejszej ręcznie

Select RouteID,RouteName, OR03001 as 'Nr zamowienia', OR03005 as 'Kod artykułu',kod_CN, OR03006 as 'Produkt', WH,
cast(OR03021 AS decimal) as 'Wielkość opakowania', LoadDate as 'data kompletacji', cast(OR03011 AS decimal) as 'Wielkość zamówienia', cast(OR03012 AS decimal) as 'Skompletowane i wydrukowane', nip, OR04003 as 'Miasto', OR04004 as 'Ulica', OR04009 as 'Kod pocztowy'
from OR010100 left join OR030100 on OR01001=OR03001
			  left join OR040100 on OR03001=OR04001
			  left join zeel_Rap_Klienci on OR01004=id
			  left join zeel_Srm_Artykuly on OR03005=id_artykul
			  left join zeel_completation_Routes on OR03076=RouteID
where LoadDate>='2022-10-10' and LoadDate<'2022-10-11' and left(kod_CN, 4) in ('1514', '1517') and opakowanie>25 

where LoadDate>='2022-10-10' and LoadDate<'2022-10-11' and left(kod_CN, 4) in ('1514', '1517') and opakowanie>25

Format LoadDate jest następujący YYYY-MM-DD HH:MM;SS
Próbowałem z GETDATE() itd. wywala jakieś błędy.

Przepraszam, źle się wyraziłem jak stosuje poniższy zapis (nie wiem też czy tak to powinno wyglądać; dopiero się uczę):

where LoadDate>=GETDATE() and LoadDate<(GETDATE()+1) and left(kod_CN, 4) in ('1514', '1517') and opakowanie>25 

to zapytanie jest bez błędów, ale nie zwraca żadnych wyników, a zwraca jak stosuje zapis gdzie wpisuję ręcznie daty.

EDIT:
Udało się, zwraca jak użyłem:

where LoadDate>=CAST(GETDATE() AS DATE) and LoadDate<(GETDATE()+1)
1

A w LoadDate masz daty z godzinami czy bez? Bo jak są godziny to potencjalnie porównywanie LoadDate<(GETDATE()+1) może zgubić część wyników, jeśli twoja baza w wyniku GETDATE() + 1 zwróci datę z godziną 0000. Godzina np. 1200 będzie większa niż 0000, więc taki rekord zostanie odrzucony.
No chyba, że tu akurat o to chodzi i wynikiem ma być przedział jednodniowy.

1

Dziękuję za uwagę. Load i Route Date mają taki sam format, ale godziny są zawsze takie same 15:00 i 13:00. Wynik ma być przedziałem jednodniowym, bo to zapytanie pokazuje trasy z zamówieniami danego dnia załadunku/kompletacji, gdzie są produkty z określonymi kodami CN zawierające opakowanie jednostkowe większe niż 25, które należy rejestrować na rządowej platformie przed wysyłką:)

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