У меня есть таблица, что containts ряд столбцов одна из нее является столбцом Date.
Я должен рассчитать, сколько случаев значений того столбца относится к тому же месяцу. И возвратитесь, если в течение одного месяца, то количество суммирует больше чем 3.
Например:
____________________
| DATE | .... |
---------------------
1998-09-02
1998-09-03
1998-10-03
1998-10-04
Это не должно возвращать значение. Поскольку это не имеет необходимого количества повторений.
Но это это делает:
____________________
| DATE | .... |
---------------------
1998-09-02
1998-09-03
1998-09-12
1998-09-14
1998-10-02
1998-11-21
В течение ноябрьского месяца.
Для DB Oracle.
SELECT
COUNT(date)
, TRUNC(DATE,'MON')
FROM TABLE
GROUP BY TRUNC(DATE,'MON')
HAVING COUNT(DATE) > 3
Значит, если 3 колонки содержат 1999-01-xx, вы хотите, чтобы это было извлечено?
SELECT YEAR(date), MONTH(date)
FROM table GROUP BY YEAR(date), MONTH(date)
HAVING COUNT(*) > 3
Если вам нужны все строки, содержащие верхний результат, это должно выглядеть примерно так
SELECT * FROM table
INNER JOIN (
SELECT YEAR(date) as y, MONTH(date) as m
FROM table GROUP BY YEAR(date), MONTH(date)
HAVING COUNT(*) > 3
) as virtualTable
ON virtualTable.y = YEAR(date) AND virtualTable.m = MONTH(date)
Этот пример поможет:
create table d1
( event_date date, event_description varchar2(100));
insert into d1 values (sysdate,'Phone Call');
insert into d1 values (sysdate,'Letter');
insert into d1 values (sysdate-50,'Interview');
insert into d1 values (sysdate-50,'Dinner with parents');
insert into d1 values (sysdate-100,'Birthday');
insert into d1 values (sysdate-100,'Holiday');
insert into d1 values (sysdate-100,'Interview');
insert into d1 values (sysdate-100,'Phone Call');
commit;
select * from d1;
EVENT_DATE EVENT_DESCRIPTION
------------------------- -----------------------------------------------
04-MAR-10 14.47.58 Phone Call
04-MAR-10 14.47.58 Letter
13-JAN-10 14.47.58 Interview
13-JAN-10 14.47.58 Dinner with parents
24-NOV-09 14.47.58 Birthday
24-NOV-09 14.47.58 Holiday
24-NOV-09 14.47.58 Interview
24-NOV-09 14.47.58 Phone Call
8 rows selected
Вы можете видеть, что ноябрь-09 - единственный месяц, в котором больше трех событий.
Возвращаясь к вашему первоначальному вопросу, который был И верните, если в течение одного месяца сумма этого счета превышает 3 . Следующий агрегат SQL будет работать.
select trunc(event_date,'MONTH'),count('x') from d1
having count('x') > 3 group by trunc(event_date,'MONTH')
В качестве альтернативы можно использовать to_char для преобразования типа Date в Char с изображением МЕСЯЦ-ГГГГ следующим образом:
select to_char(trunc(event_date,'MONTH'),'MON-YYYY') month,
count('x') no_of_occurances from d1 having count('x') > 3 group trunc(event_date,'MONTH')
Это должно работать для mysql и mssql:
SELECT MONTH(date), Sum(MONTH(date))
FROM table
GROUP BY date
HAVING Sum(MONTH(date)) > 3
Я не уверен, какую базу данных вы используете.
В MySQL запрос будет аналогичен методу, предложенному @THEn
На сервере SQL у вас есть другие интересные возможности.
Подробнее читайте в статье .
Вы можете использовать метод Oracle EXTRACT:
select theMonth, sum(monthCount)
from (
select
extract(MONTH FROM t.theDateColumn) as theMonth,
1 as monthCount
)
group by theMonth
having sum(monthCount) >= 3
В настоящий момент у меня нет базы данных Oracle, поэтому этот код может не работать как есть - Прошу прощения за это.
В идеале вы должны создать хранимую процедуру, которая принимает два необходимых вам критерия: месяц (целое число) и предел (целое число)
В параметризованной процедуре, которая выполняет следующее
SELECT MONTH(Date) AS TheMonth, COUNT(MONTH(Date)) AS TheMonthCount
FROM MyTable
GROUP BY MONTH(Date)
HAVING (COUNT(MONTH(Date)) > @limit) AND (MONTH(Date) = @month)
Чтобы также вывести соответствующий месяц, вы можете использовать следующие
SELECT CAST(YEAR(Date) AS NVARCHAR) + '.' +
CAST(MONTH(Date) AS NVARCHAR) AS 'The ',
MONTH(Date ) AS TheMonth, COUNT(MONTH(Date)) AS TheMonthCount
FROM Audit_Entry
GROUP BY MONTH(Date),
CAST(YEAR(Date) AS NVARCHAR) + '.' +
CAST(MONTH(Date) AS NVARCHAR)
HAVING (COUNT(MONTH(Date)) > @limit) AND (MONTH(Date) = @month)
create table x (date_col date);
insert into x values (date '1998-09-02');
insert into x values (date '1998-09-03');
insert into x values (date '1998-09-12');
insert into x values (date '1998-09-14');
insert into x values (date '1998-10-02');
insert into x values (date '1998-11-21');
SELECT TRUNC(date_col,'MM'), count(*)
FROM x
GROUP BY TRUNC(date_col,'MM')
HAVING count(*) > 3;
Могу ошибаться, но предположение:
SELECT SUM(date) FROM table
GROUP BY date where SUM(date) > 3