Zapytanie wyznaczające sume przychodów w danych miesiącach

1

Witam ponownie
Mam tabelę, w której zbieram transakcje wraz z informacjami o przychodach. Mam problem ze stworzeniem zapytania, które sumowałoby przychody z danego miesiąca, tak bym za pomocą tabeli:

[DATA] [KWOTA]
[05-11-2010] [1400,45]
[13-11-2010] [2000,00]
[04-12-2010] [2569,00]
[23-12-2010] [3000,00]
[03-01-2011] [2000,00]
[05-01-2011] [2321,33]

otrzymywał tabelę w stylu

[MIESIAC] [SUMA]
[11-2010] [3400,45]
[12-2010] [5569,00]
[01-2011] [4321,33]

Zastanawiałem się rowniez, czy byłby sposób, żeby wyznaczyć sumy tylko z ostatnich kilku miesięcy... (tutaj to pewnie akurat bujam w obłokach :))

1
select Year(data), MONTH(data), sum(kwota) FROM tabela GROUP BY Year(data), MONTH(data)

a jak to nie przejdzie to

SELECT rok, miesiac, sum(kwota) FROM (select Year(data) rok, MONTH(data) miesiac, kwota FROM tabela)  GROUP BY rok, miesiac
1

@Misekd: To Firebird ma być więc prędzej coś takiego:

SELECT First 10 Extract(Year from DATA), Extract(Month from DATA), SUM(KWOTA) FROM Przychody GROUP BY Extract(Year from DATA), Extract(Month from DATA) desc

edit: znaczy, chodzi mi o to że w Firebird nie ma funkcji Year, Month... chyba że się mylę.

0
SELECT EXTRACT(MONTH FROM DATA),SUM(PRZYCHOD_N)
FROM PRZYCHODY GROUP BY EXTRACT(MONTH FROM DATA)

Próbowałem tej uproszczonej wersji, wyraźnie jest problem z użyciem funkcji sum, przy tej składni, gdyż poniższy zapis działa:

SELECT EXTRACT(MONTH FROM DATA),PRZYCHOD_N
FROM PRZYCHODY

EDIT: własnie mi się przypomniało, że kiedyś obszedłem to stworzeniem widoku, i następnie wyznaczeniem sumy z widoku, zaraz postaram się to zweryfikować

1

Musiałem najpierw stworzyć widok na bazie zapytania

SELECT EXTRACT(MONTH FROM DATA) "MIESIAC",PRZYCHOD_N FROM PRZYCHODY

Następnie z tego widoku mogłem wyznaczyć sumę za pomocą

SELECT MIESIAC, PRZYCHOD FROM <NAZWA_WIDOKU> GROUP BY MIESIAC ORDER BY MIESIAC ASC 

Dwie kwestie wciąż jednak mnie nurtują:
•SELECT FIRST 10 nie działa (zdaje się, że zapytanie działa w firebird, jednak nie w interbase, staram się znaleźć coś w internecie, jak na razie bezskutecznie)

EDIT:
ta kwestie udało mi sie rozwiazac, w interbase wygląda to tak:

select * from PRZYCHODY rows 10;

•W przypadku takiego wyznaczenia pole miesiąc będę mieć kolejno zapisy 2011-1, 2011-11, 2011-2 co oczywiście tez nie jest idealnym rozwiązaniem

1

Ja się słabo orientuję w FB/InterBase, ale spróbuj rzutowania ROK i MIESIAC na numeric, i zrób order by po tych zamienionych polach.

(dokumentacja CAST - co prawda dla FB 2.0, ale może się przyda)
http://www.firebirdsql.org/refdocs/langrefupd20-cast.html

0
select
  extract(year from data) rok,
  extract (month from data) miesiac,
  sum(kwota)
from
  table
group by
  rok,
  miesiac
order by
  rok,
  miesiac

tylko z trzech ostatnich miesięcy (12.2010, 01.2011, 02.2011

select
  extract(year from data) rok,
  extract (month from data) miesiac,
  sum(kwota)
from
  table
where
  data between cast ('12-01-2010' as date) and cast ('02-28-2011' as date)
group by
  rok,
  miesiac
order by
  rok,
  miesiac
0

Wciąż główkuje jak wymusić prawidłowa kolejność rekordów.... czyli najlepiej żeby miesiące były numerowane 01,02,03..., ewentualnie słownie, skrótami o ile jest taka możliwość formatowania

Próbowalem rzutowania na numeric, niestety wyrzuca błąd.

SELECT CAST (EXTRACT(MONTH FROM P.DATA) AS numeric) "DATA" FROM PRZYCHODY
0

ja [CIACH!] - przecież ci podałem zapytanie jak ma wyglądać. A do sortowania to by trzeba użyć klauzuli ORDER BY a nie główkować

no comment ...

1

pisałem już, że nie da się w interbase grupować po polach utworzonych metoda EXTRACT (przynajmniej nie w ten sposób). Druga sprawa jest taka, że zależy mi na złączeniu pól miesiąc i rok. Domyślam się, że można zostawić osobne pola do samego sortowania, chociaż nie wiem czy to będzie miało znaczenie później, gdy będę tworzył zapytanie w którym pobiorę tylko pole łączone.

EDIT:
Z wcześniej utworzonego widoku mogę wyodrębnić posortowane rekordy. Ostateczne rozwiązanie prezentuje się tak:

  1. Utworzenie widoku:
CREATE VIEW "PRZYCHODY_MIES" (
  "ROK", 
  "MIESIAC", 
  "DATA", 
  "NR_REJ", 
  "PRZYCHOD_B"
) AS

SELECT EXTRACT(YEAR FROM P.DATA) "ROK", EXTRACT(MONTH FROM P.DATA) "MIESIAC",
(EXTRACT(YEAR FROM P.DATA)||'-'||EXTRACT(MONTH FROM P.DATA)) "DATA",
S.NR_REJ, P.PRZYCHOD_B
FROM PRZYCHODY P, SAMOCHODY S, WYJAZDY W
WHERE P.ID=W.ID AND S.NR_REJ=W.NR_REJ
;
  1. Zapytanie sumująco-sortujące
SELECT NR_REJ, DATA, SUM(PRZYCHOD_B)
FROM PRZYCHODY_MIES
GROUP BY NR_REJ, DATA
ORDER BY ROK, MIESIAC

Dziękuje za zaangażowanie i pomoc w drodze do rozwiązania tego problemu. Interbase po raz kolejny udowadnia mi, że nawet proste rzeczy trzeba w nim obchodzić dziwnymi rozwiązaniami

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