[英]Consolidating data under one month in Oracle SQL
我需要為一個類編寫一個查詢,但我遇到了一些麻煩。 我需要查詢來拉出所有在二月份注冊的學生。 我現在有一個有效的查詢,但它沒有輸出我需要的內容。 這是我到目前為止...
SELECT COUNT(*) "February_Registration", enroll_date
FROM enrollment
WHERE enroll_date LIKE '%FEB%'
GROUP BY enroll_date ;
這是我從這個查詢中得到的輸出......
February_registration | enroll_date
...................................
14 | 02-FEB-07
36 | 01-FEB-07
22 | 10-FEB-07
26 | 16-FEB-07
20 | 07-FEB-07
24 | 11-FEB-07
我需要做的是將所有這些數字加起來像這樣在一個“二月”行下......
February_Registration | enroll_date
142 | February
我錯過了什么,我需要做什么才能讓它發揮作用。 請在發布代碼之前解釋一下自己,我想真正學習這些材料,如果我必須坐在那里找出我以前從未見過的代碼,那么要做到這一點是非常困難的。 它沒有幫助,我想要一個很好的解釋以及任何代碼建議。
提前致謝。
如果您只想要總數,則不需要GROUP BY
。
而且,永遠不要在日期列上使用LIKE
。 LIKE
接受字符串參數,因此日期列被轉換為字符串,使用數據庫中的各種設置(大多數人通常不會擺弄)。
這是一個替代方案:
SELECT COUNT(*) as February_Registration,
'February' as enroll_date -- I'm not exactly sure why this is needed
FROM enrollment
WHERE EXTRACT(month FROM enroll_date) = 2;
或者,您可以將其表示為:
WHERE TO_CHAR(enroll_date, 'MON') = 'FEB'
請注意,不需要雙引號。
現在,一般來說,人們並不關心“二月”。 人們關心給定年份中的二月。 如果是這種情況,查詢最好寫成:
SELECT COUNT(*) as February_Registration
FROM enrollment
WHERE enroll_date >= DATE '2016-02-01' AND
enroll_date < DATE '2016-03-01';
通過避免在enroll_date
調用函數,您可以給優化器更多的機會來調整查詢。
SELECT SUM( February_Registration ) AS February_Registration,
CASE WHEN EXTRACT( MONTH FROM enroll_date ) = '02'
THEN 'February' END AS enroll_date
FROM enrollment
GROUP BY enroll_date;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.