Sprawdzenie Pareto w SQL

Odpowiedz Nowy wątek
2019-10-10 15:37
0

Słuchajcie, ostatnio zastanawiam się jak sprawdzić Pareto w przypadku sprzedaży.

Załóżmy, że jest tabela sprzedaży.

Czy jest sposób, aby policzyć ile produktów (w podziale na dni) w danej grupie generuje 80% obrotu?

Posegregowanie po wielkości obrotu (desc), ale co dalej?

Pozostało 580 znaków

2019-10-10 15:40
0

Jaka baza?

Pozostało 580 znaków

2019-10-10 15:41
0

Access (niestety).

Pozostało 580 znaków

2019-10-10 15:49
1

Skoro już napisałem, to pozostawię. Na Access nie działa (postgreSQL)

with x(wartosc) as (select unnest(array[1,1,4,3,2,2,10,1,1,12])),
p as (select wartosc, 1.*(sum(wartosc) oveR(order by wartosc desc))/(sum(wartosc) over()) wsk, sum(wartosc) oveR(order by wartosc desc) suma_biez, sum(wartosc) oveR() razem from x)
select * from p where wsk<.8

Pozostało 580 znaków

2019-10-10 15:56
0

A jest jakaś szansa zrobić w Accessie? W sensie - czy się da w ogóle?

edytowany 1x, ostatnio: Qlikeers, 2019-10-10 16:00

Pozostało 580 znaków

2019-10-10 18:15
0

Tak mnie zastanawia... Nie możesz po prostu zebrać dochodów po produkcie po dniach i z tak przygotowanej relacji wyciągnąć to co ciebie interesuje?

Pozostało 580 znaków

2019-10-10 21:55
0

Da się, ale to rzeźba, skoro to Access to zapodaj accdb z przykładowymi danymi i oczekiwanym wynikie, bo podział na dni to można róznie rozumieć (dzień tygodnia/miesiąca/roku)

Etam, rzeźba. Zapytanie sumujące skorelowane obliczające sumę narastająco. Potem już zwykła proporcja... - Marcin.Miga 2019-10-11 08:11

Pozostało 580 znaków

2019-10-11 08:56
0
wartek01 napisał(a):

Tak mnie zastanawia... Nie możesz po prostu zebrać dochodów po produkcie po dniach i z tak przygotowanej relacji wyciągnąć to co ciebie interesuje?

Mogę, mogę też dodać na kalkulatorze :)
Chodzi mi bardziej o ćwiczenie, które można odświeżać w przyszłości - wraz z momentem aktualizacji tabeli źródłowej.

Nie mam teraz gotowych danych, ale ćwiczenie jest takie, żeby dla danego dnia i grupy produktów podać ile produktów (unikalnych) robi 80% obrotu.

Gdybym miał zrobić makro w Excelu to pewnie zrobiłbym to tak, że w tabeli (posegregowanej wg obrotu malejąco) działałaby pętla, która zatrzymuje się w wierszu, gdzie obroty narastająco przekraczają 80%. Wynikiem byłby numer wiersza, gdzie się zatrzymało.

Po prostu zastanawiam się od paru dni, czy da się to zrobić w Accessowym SQL'u.

edytowany 1x, ostatnio: Qlikeers, 2019-10-11 08:57

Pozostało 580 znaków

2019-10-11 08:58
0

Da sie, jak nie masz danych to je przygotuj, własna incjatywa mile widziana

Pozostało 580 znaków

2019-10-11 09:24
0

Jasne, przygotowałem na szybko. Mam nadzieję, że zachowałem spójność :)

Pozostało 580 znaków

2019-10-11 10:40
2

Własciwie do policzenia potrzebujemy kilka rzeczy:

  1. Tabele sprzedaży w okresie
  2. Sumy sprzedaży narastajaco
  3. Sumy globalnej
  4. Troche matematyki

ad.1 Kwerenda suma_okres (w przykładzie okres I półrocza 2018)

SELECT 
     sales.group
    ,sales.productid
   , um(CCur([sales])) AS s
FROM 
     sales
WHERE 
    (((sales.date) Between #1/1/2018# And #6/30/2018#))
GROUP BY 
    sales.group
   , sales.productid;

ad.2 sumy narastajaco kwerenda sum_narastajaco

SELECT 
    o1.group
    , o1.productid
    , sum(o2.s) AS sn
FROM 
    suma_okres AS o1 
    INNER JOIN suma_okres AS o2 ON o1.s >= o2.s
GROUP BY 
    o1.group
    ,o1.productid;

ad. 3 to załatwiamy cross joinem w głównym zapytaniu

ad. 4 Kwerenda raport

SELECT 
    s.group
    , s.productid
    , s.s as [Sprzedaż]
    , sum_narastajaco.sn [Sprzedaż narastająco]
    , s.sa [Sprzedaż globalnie]
    , round(s/sa,5)*100 as [% w sprzedaży]
    , round(sn/sa,5)*100 as [% narastająco]
FROM (select 
        * from 
    (select sum(s) as sa from suma_okres) as sa,suma_okres)  AS s 
    INNER JOIN sum_narastajaco ON (s.productid = sum_narastajaco.productid) AND (s.group = sum_narastajaco.group);

Wynik:
screenshot-20191011103412.png

W załączniku plik accdb

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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