由於項目需要獲取(本季度的的發生額總和)/(本季度經歷的天數)的數據(還有月均,年均的數據)。
判斷季度的時候是一個難點,開始的時候寫了一堆case when 來判斷月份,后來寫着寫着發現,這樣也太笨了。於是就開始想辦法。
突然靈機一動,一個季度都是以3個月份為一個體的。何不先算出本日是第幾季度,然后再乘以3就是季度初啊。
因為3月份除以3就等於1了.必須除一個比3大的數,而且月份的數字只會到12.不用擔心除以3.1會出什么亂子。
下面是計算第幾季度的sql
select floor(substr('2017-02-04',6,2)/3.1)+1
出來了第幾季度之后就簡單了。直接*3唄 就是季度的初始日期了。
select (floor(substr('2017-02-04',6,2)/3.1)*3)+1
具體源代碼:
select bill_no,
sum(case when part_dt >= concat(substr('${START_DATE}',1,7),'-01') and part_dt<='${START_DATE}' then nvl(amt,0) else 0 end)/((DATEDIFF('${START_DATE}',CONCAT(SUBSTR('${START_DATE}',1,7),'-01'))+1)) month_da,
sum(case when part_dt >= concat(substr('${START_DATE}',1,4),'-',substr(concat('00',floor(substr('${START_DATE}',6,2)/3.1)*3+1),-2),'-01') and part_dt<='${START_DATE}' then nvl(amt,0) else 0 end)/((DATEDIFF('${START_DATE}',CONCAT(SUBSTR('${START_DATE}',1,4),'-',SUBSTR(CONCAT('00',FLOOR(SUBSTR('${START_DATE}',6,2)/3.1)*3+1),-2),'-01'))+1)) quarter_da,
sum(case when part_dt >= concat(substr('${START_DATE}',1,4),'-01-01') and part_dt<='${START_DATE}' then nvl(amt,0) else 0 end)/((DATEDIFF('${START_DATE}',CONCAT(SUBSTR('${START_DATE}',1,4),'-01-01'))+1)) year_da
from xxxx_table_xxxx dlt
group by bill_no