Liczba nowych klientów na przestrzeni miesięcy - ACCESS SQL

0

Cześć!
Szukam rozwiązanie SQLowego (SQL ACCESS) dla problemu liczby nowych klientów.

Potrzebuję z tabeli sprzedażowej (przykład w załączniku) wyciągnąć liczbę nowych klientów (kupili w danym miesiącu, a wcześniej nie dokonywali zakupów -> czyli dla danego miesiąca minimalna data faktury = maksymalnej dacie faktury (sprowadzone do miesięcy)).

Problemem jest to, że:

  1. Potrzebuję te liczby w rozbiciu na: a) Marki, b) Zmienna
  2. Potrzebuję aktualizować na bieżąco, z danymi historycznymi - także za ubiegły rok (sty - gru 2017).

Czyli w wyniku byłoby np. liczba nowych klientów dla marki VBA w rozbiciu na poszczególne miesiące.

Albo liczba nowych klientów Zmiennej b na poszczególne miesiące.

Ciężko mi to wyjaśnić, jakby co to będę starał się doprecyzować :)

Przykład (wycinek) bazy w załączniku.

1

HAVING Month(Min(data_faktury))=Month(Max(data_faktury)) and Year(Min(data_faktury))=Year(Max(data_faktury))

1

Masakryczne dane do testowania wybrałeś, bo występuje w nich tylko jeden klient... Zakładając że masz tabelę t o kolumnach data, marka, zmienna, klient,

To kwestia wyciągnięcia tylko klientów którzy robili zakupy pierwszy raz w miesiącu:

SELECT t.* , p.pierwsza
FROM   t 
       INNER JOIN (SELECT klient, 
                          Format(Min(data), "yyyy-mm") AS pierwsza 
                   FROM   t 
                   GROUP  BY klient) AS p 
               ON p.klient = t.klient 
WHERE  p.pierwsza = Format(t.data, "yyyy-mm") 

jak nazwiesz ją bazowa to policzenie klientów to kwestia agregacji:

SELECT pierwsza, 
       Count(klient) AS iloscnowych 
FROM   (SELECT DISTINCT [pierwsza], 
                        klient 
        FROM   bazowa) dt 
GROUP  BY pierwsza 

reszta analogicznie, w załączniku przykład accdb

0

Dzięki! :) Jakoś sobie z nowymi poradziłem.

Ale mam (wydaje mi się) trudniejszą sprawę - a jak wyciągnąć liczbę klientów, którzy nie kupowali przez np. ostatni rok. Gdyby to robić na dziś to nie byłoby to bardzo trudne, bo dzis()-max(data_faktury) i jak będzie >=365 to jest ten o którego nam chodzi.

Ale jak to zrobić dla całego zakresu danych (aby pokazywał też dla grudnia 2017, listopada 2017, itd.). Jest jakby inny punkt odniesienia, kroczący zakres danych..

1

Zakładam że masz tabelę klietów, więc wystarczy zrobić warunek

select * from klienci where id not in (select klient from t where data_faktury between DateAdd ("yyyy", -1, #2017-12-31#) and #2017-12-31#)

gdzie data 2017-12-31 to Twój "punk początkowy.

Oczywiście jako że negacja w where jest nieoptymalizwona warto użyć join:

select klienci.*
from klienci as k
left join  (select klient from t where data_faktury between DateAdd ("yyyy", -1, #2017-12-31#) and #2017-12-31#) as f on f.klient=k.id
where f.klient is null
0

Tak, rozwiązanie na bieżący okres jestem w stanie sformułować. Rozumiem tok myślenia.

Szukam rozwiązania, które pozwoliłoby mi wyrzucić dane dla całego dostępnego w tabeli okresu (w sensie zakresu). Nie wiem jak to dobrze opisać. Chodzi o to, żeby (zamieniając rok z poprzedniego przypadku na miesiąc) mieć w wyniku takie dane dla wszystkich miesięcy, które są w bazie. Np. dla grudnia 2017, listopada 2017, października 2017, itd..
Nie umiem tego rozwiązać - chodzi o to, aby nie robić tego ręcznie dla każdego zakresu.
Gdybym robił to "ręcznie" dla każdego miesiąca to musiałbym ograniczać zakres danych źródłowych (taki można powiedzieć "pływający/kroczący"):

  • dla grudnia musiałby to być zakres od 31-12-2017 wszystko wstecz,
  • dla listopada od 30-11-2017 wszystko wstecz,
  • itd.

A punkt początkowy (jak go nazwałeś), aby był maksymalną datą sprzedaży w bazie.

Ale czy da się to rozwiązać tak, aby rozwiązaniem był uaktualniony wynik dla każdego miesiąca na ustalony moment w czasie?
Jakby coś było niezrozumiałe to postaram się inaczej sformułować :)

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