Zapytanie SQL zwracające wartości dla brakujących miesięcy

0

Jest sobie hurtownia, klienci co miesiąc biorą określoną ilość towaru.
W tabeli towar1 jest: user, rok, miesiac, ilosc
Nowy rekord jest dopisywany jak sie coś zmieni.
Czyli mamy dla jednego usera np:
1 (user), 2015, 12 (grudzień) , 400 (ilość)
1 (user), 2016, 2 (luty) , 500 (ilość)
1 (user), 2016, 6 (czerwiec) , 600 (ilość)
Jak powinno wyglądać zapytanie, które wyświetli ilość towaru dla wszystkich miesięcy, czyli:
user, rok, miesiąc, ilość:
1, 2015, 12, 400
1, 2016, 1, 400
1, 2016, 2, 500
1, 2016, 3, 500
1, 2016, 4, 500
1, 2016, 5, 500
1, 2016, 6, 600
1, 2016, 7, 600
1, 2016, 8, 600

Jedyne co mi w tej chwili przychodzi do głowy to osobne zapytanie dla każdego miesiąca i UNION co mi się za bardzo nie podoba bo co miesiąc należało by je modyfikować...

Dowiązując to za pomocą LEFT JOIN ze stworzoną tabelą zawierającą miesiące dla niektórych miesięcy będę miał NULLe i nie wiem jak tego uniknąć?
Czy jest szansa zrobienia tego bez procedury, deklaracji dodatkowych zmiennych...?

Za każdą podpowiedź będę wdzięczny.

0

Jak rozumiem w tabeli masz np 3 rekordy a w select chcesz wyciągnąć wszystkie rekordy per miesiąc od min(data) do max(data) czyli np 24 rekordy tak?

1

W MSSQL jest to całkiem proste. Wystarczy, że stworzysz sobie tabelę tymczasową:

declare @LOC  table (Year int, month int, value int); 

następnie stworzysz sobie funkcję wyliczającą ilość miesięcy między poszczególnymi datami np tak:
http://stackoverflow.com/questions/1106945/calculating-number-of-full-months-between-two-dates-in-sql
następnie uzupełnisz @LOC o brakujące miesiące/lata wpisując odpowiednią wartość i na końcu select z tej tabeli ;)
Tak z grubsza

0
SELECT user, miesiac, rok, sum(ilosc) FROM table  GROUP BY user, miesiac, rok

O takie coś chodzi ?

0

Np. tak:

select coalesce(A.Miesiac, B.Miesiac) as Miesiac
from tMiesiace A
left join tDane B on B.Miesiac = A.Miesiac

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