SQL sumowanie warunkowe

SQL sumowanie warunkowe
R1
  • Rejestracja:prawie 10 lat
  • Ostatnio:prawie 10 lat
  • Postów:2
0

Witam

Na wstępie napiszę, że jestem początkowym SQLowcem i dopiero się uczę. Póki co umiem wyciągnąć podstawowe dane z wielu tabel, ale mam przypadek który mnie przerasta. Myślę że przypadek jest podobny do EXCELowej funkcji SUMA.JEŻELI z wieloma warunkami. Chodzi o to żeby zsumować wszystkie wartości po DATACH, przy czym dla każdej NAZWY data minimalna musi być mniejsza bądź równa od '2014.01.01' oraz data maksymalna musi być większa bądź równa od '2015.12.31' i dla tylko dla takich przypadków sumujemy wartości po DACIE. Proszę o pomoc w zmierzeniu się z tym wyzwaniem.

Tabela wygląda mniej więcej tak:

DATA NAZWA WARTOŚĆ
2014-01-01 nazwa1 663
... nazwa1 834
2014-12-31 nazwa1 269
2014-05-01 nazwa2 193
... nazwa2 370
2014-12-31 nazwa2 450
2013-05-01 nazwa3 507
... nazwa3 666
2014-11-30 nazwa3 664
ŚM
  • Rejestracja:prawie 10 lat
  • Ostatnio:prawie 10 lat
  • Postów:44
0

Nie bardzo wiem czy chodzi Ci o

Kopiuj
SELECT Data, Nazwa, SUM(Wartość) WHERE Data >= '2014-01-01'  AND Data <= '2015-12-31' GROUP BY Data, Nazwa

czy może o

Kopiuj
SELECT Nazwa, SUM(Wartość) WHERE Data >= '2014-01-01'  AND Data <= '2015-12-31' GROUP BY Nazwa
R1
  • Rejestracja:prawie 10 lat
  • Ostatnio:prawie 10 lat
  • Postów:2
0

Nie chodzi mi ani o jedno ani o drugie. Ma to działać w ten sposób, że dla każdej nazwy wyciąga minimalną i maksymalną datę i sprawdza czy te daty spełniają warunki, tzn czy data minimalna jest mniejsza bądź równa niż 2014.01.01 oraz czy data maksymalna jest większa bądź równa niż 2014.12.31. Jeżeli dla danej nazwy jest spełniony ten warunek to ma być uwzględniona w sumie grupowanej po dacie. Czyli w załączonym przykładzie tylko NAZWA1 spełnia warunki więc zapytanie powinno wypluć coś takiego:

DATA SUM_WARTOŚĆ
2014-01-01 663
... 834
2014-12-31 269
simmy
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 9 lat
  • Postów:5
1

Nie sprawdzałem czy działa, ale próbowałbym coś takiego:

Kopiuj
SELECT data, SUM(wartość)
FROM tab_name outerr,
(SELECT nazwa, MIN(DATA), MAX(DATA)
FROM tab_name
GROUP BY nazwa
HAVING MIN(DATA) <=TO_DATE('2014/01/01') AND MAX(DATA)>=TO_DATE('2014/12/31')) innerr
WHERE outerr.nazwa = innerr.nazwa
GROUP BY DATA
edytowany 3x, ostatnio: simmy

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.