Przykład tabeli
ROW-------|---ID---|---FROM_DATE-------|---TO_DATE------|---PRICE---
1---------|---10---|---2014-02-01------|---2014-02-28---|---150.00---
2---------|---22---|---2014-01-10------|---2014-02-09---|---200.00---
3---------|---39---|---2014-02-20------|---2014-03-19---|---120.00---
4---------|---45---|---2014-01-15------|---2014-04-14---|---600.00---
Teraz muszę obliczyć, ile pieniędzy (względnie) każdy identyfikator utworzył tylko w lutym 2014 roku.
Pierwszy rząd jest łatwy, cała kwota jest w lutym 2014 roku.
W drugim rzędzie muszę obliczyć, że w styczniu jest 31 dni i 9/31 kwoty.
W trzecim rzędzie jest podobnie jak w drugim rzędzie, w lutym jest 28 dni, a więc 9/28 kwoty.
Czwarty rząd jest trudny, luty wcale się nie pokazuje i wiem, że między 15 stycznia a 14 kwietnia jest 90 dni, dlatego powinienem otrzymać 28/90 kwoty.
Wynik poszukiwany:
ROW-------|---ID---|---MONTH----|---SUM---
1---------|---10---|---02/2014---|---150.00---
2---------|---22---|---02/2014---|---58.06---
3---------|---39---|---02/2014---|---38.57---
4---------|---45---|---02/2014---|---186.66---
Proszę mi pomóc, jak to zrobić.
Dzięki!!!
Odpowiedzi:
1 dla odpowiedzi № 1To trochę trudne.
Oto jedna metoda liczenia tylko pokrywających się dni w lutym (lub innym okresie):
select sum(datediff(least(to_date, date("2014-03-01")), greatest(from_date, "2014-02-01"))) as days
from table t
where to_date >= date("2014-02-01") and from_date < date("2014-03-01");
0 dla odpowiedzi nr 2
Wypróbuj to zapytanie:
SELECT ROW,ID,"02/2014" MONTH,
(PRICE * (CASE WHEN EN < 0 THEN 28 ELSE 28 - EN END -
CASE WHEN ST <= 0 THEN 0 ELSE 28 - ST END))/CNT SUM
FROM
(SELECT DATEDIFF(FROM_DATE,DATE("2014-02-01"))ST,
DATEDIFF(DATE("2014-03-01"),TO_DATE) - 1 EN,
DATEDIFF(TO_DATE,FROM_DATE) + 1 CNT,TABLE1.* FROM TABLE1)T1;