2016-10-11 2 views
2

Мне нужно написать запрос для класса, и у меня с ним немного проблемы. Мне нужен запрос, чтобы вытащить всех студентов, которые зарегистрировались в феврале месяце. У меня есть рабочий запрос сейчас, но он не выводит то, что мне нужно. Вот то, что я до сих пор ...Консолидация данных в течение одного месяца в 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 

Что мне не хватает, и то, что мне нужно сделать, чтобы заставить его работать. Пожалуйста, объясните сами, прежде чем отправлять код, я хочу научиться материалу, и это очень сложно сделать, если мне придется сидеть и выяснить код, который я никогда раньше не видел. Это не полезно, и я хотел бы получить хорошее объяснение вместе с любыми предложениями кода.

Заранее спасибо.

ответ

0
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; 
+0

Будет ли это работать? Я думаю, что функция EXTRACT вернет число, а не строку. – CGritton

+0

Изменено 'FEB' до 02 – Teja

1

Вам не нужен 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, вы даете оптимизатору больше возможностей для настройки запроса.

+0

Его вопрос прямо говорит о февре в таблице ... – Teja

+0

Это даст вам количество записей, а не количество зарегистрированных студентов. Вы должны использовать SUM() вместо COUNT(). – walen

+0

@walen. , , Я вообще не понимаю этот комментарий. Исходный запрос OP использует 'count()'. Предположительно, «зачисление» имеет одну строку для каждого учащегося. –