[英]Oracle SQL - Query for begin and end month/year combination
我正在嘗試編寫一個查詢,該查詢將使用四段用戶輸入:
開始月份
始年
結束月份
年末
直到我遇到一個關於查詢編碼方式的小問題為止,這似乎很簡單,這種情況發生在以下輸入作為示例時:
開始月份:一月
開學年份:2012
結束月份:八月
年底年份:2013
用我編碼查詢的方式,它只接收了2012年1月至2012年8月以及2013年1月至2013年8月的數據。我希望它包含2012年全年的數據,然后包含2013年1月至2013年8月的數據。我猜我需要一個聯合聲明才能起作用,但是我承認我不太擅長Oracle SQL,因為我沒有太多機會經常練習它。 因此,我可能會以錯誤的方式進行操作。
我嘗試更新查詢以包含並集語句,並且Oracle拋出一個錯誤,原因是我在表達式中的三個字段(trsum.project_id,trsum.month和trsum.year)上使用了無效標識符。 當我嘗試將其更改為分配給各列的別名(ordered_id,ordered_month和ordered_year)時,收到關於project_id字段不是單個組函數的錯誤。 我顯然在創建包含按表達式分組的並集查詢方面缺少一些東西,但是如果我現在能弄清楚是什么,我會很驚訝。
我包括了更新后查詢的簡化版本,該版本保留了我在此處完整提及的所有要點,以供參考。 union語句之前的上半部分是我編寫的原始查詢,下半部分是我嘗試從上述示例中獲取所需數據的嘗試。 如果有人對我做錯的事情有任何建議或建議,或者有更好的方法來獲取我要查找的數據,那么我願意接受所有建議。 如果有什么需要我進一步澄清的,請隨時提出。
select * from(
select trsum.project_id as ordered_id
, trsum.month as ordered_month
, trsum.year as ordered_year
, sum(trsum.costs) "Costs"
, sum(trsum.hours) "Hours"
from
substituteTableName trsum
where
trsum.month between :START_MONTH and :END_MONTH
and trsum.year between :START_YEAR and :END_YEAR
union
select trsum2.project_id as ordered_id
, trsum2.month as ordered_month
, trsum2.year as ordered_year
, sum(trsum2.costs) "Costs"
, sum(trsum2.hours) "Hours"
from
substituteTableName trsum2
where
trsum2.month between :START_MONTH and 11
and trsum2.year = :START_YEAR
)
group by trsum.project_id, trsum.month, trsum.year
order by
ordered_id
, ordered_year
, ordered_month
您應該使用日期,而不僅僅是兩個月之間的日期,因為那是不正確的。 就像是:
WHERE
to_date((trsum.ppt_fiscal_month + 1 || '-' || trsum.ppt_fiscal_year), 'MM-YYYY') >=
to_date((start_month || '-' || start_year), 'MM-YYYY'
AND
to_date((trsum.month + 1 || '-' || trsum.year),'MM-YYYY') <=
to_date((end_month || '-' || end_year), 'MM-YYYY'
和其他條件類似。
我認為解決這些情況的一種簡便方法是將值轉換為YYYYMM形式。 您的where
子句變為:
where trsum.year*100 + trsum.month between :START_YEAR * 100 + :START_MONTH and
:END_YEAR * 100 + :END_MONTH
where trsum.year*100 + trsum.month between :START_YEAR * 100 + :START_MONTH
:START_YEAR * 100 + 11;
當然,第二個不必更改。 它應該按書面規定正確工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.