簡體   English   中英

在 Oracle SQL 中整合不到一個月的數據

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM