Як згрупувати за місяцем із поля Дата за допомогою sql


84

Як я можу згрупувати лише за місяцем із поля дати (а не групувати за днями)?

Ось як виглядає поле дати:

2012-05-01

Ось мій поточний SQL:

select  Closing_Date, Category,  COUNT(Status)TotalCount from  MyTable
where Closing_Date >= '2012-02-01' and Closing_Date <= '2012-12-31'
and Defect_Status1 is not null
group by  Closing_Date, Category

Відповіді:


108

Я б використав це:

SELECT  Closing_Date = DATEADD(MONTH, DATEDIFF(MONTH, 0, Closing_Date), 0), 
        Category,  
        COUNT(Status) TotalCount 
FROM    MyTable
WHERE   Closing_Date >= '2012-02-01' 
AND     Closing_Date <= '2012-12-31'
AND     Defect_Status1 IS NOT NULL
GROUP BY DATEADD(MONTH, DATEDIFF(MONTH, 0, Closing_Date), 0), Category;

Це буде групуватися до першого числа кожного місяця, отже

`DATEADD(MONTH, DATEDIFF(MONTH, 0, '20130128'), 0)` 

дасть '20130101'. Я зазвичай віддаю перевагу цьому методу, оскільки він зберігає дати як дати.

В якості альтернативи ви можете використовувати щось на зразок цього:

SELECT  Closing_Year = DATEPART(YEAR, Closing_Date),
        Closing_Month = DATEPART(MONTH, Closing_Date),
        Category,  
        COUNT(Status) TotalCount 
FROM    MyTable
WHERE   Closing_Date >= '2012-02-01' 
AND     Closing_Date <= '2012-12-31'
AND     Defect_Status1 IS NOT NULL
GROUP BY DATEPART(YEAR, Closing_Date), DATEPART(MONTH, Closing_Date), Category;

Це насправді залежить від бажаного результату. (Рік закриття не є необхідним у вашому прикладі, але якщо діапазон дат переходить межу року, це може бути).


GarethD, дякую людині, обидва методи працювали нормально. Чи є спосіб згрупувати і рік, і місяць разом в одному полі? Сенс показувати у такому форматі: грудень-12 (грудень - місяць, а рік - рік). спасибі
user1858332

Перший метод це зробить, вам просто потрібно відформатувати стовпець. Я радив би робити це за межами SQL, але якщо це потрібно робити як таке, ви можете використовувати щось на зразокSELECT STUFF(SUBSTRING(CONVERT(VARCHAR, CURRENT_TIMESTAMP, 6), 4, 6), 4, 1, '-');
GarethD

@GarethD Не могли б ви пояснити, як ви просто використовували dateiff між 0 та датою. 0 не є датою.
irfandar

1
а також що робить Closing_Date = DATEADD (MONTH, DATEDIFF (MONTH, 0, Closing_Date), 0), чому не просто DATEADD (MONTH, DATEDIFF (MONTH, 0, Closing_Date), 0)
irfandar

3
@irfandar 0 не є датою, але SQL-сервер неявно перетворює її на 1 січня 1900 року. Для вашого другого питання Closing_Date =це лише псевдонім стовпця, він такий самий, як і AS Closing_Dateпісля виразу. Це цілком суб'єктивно, але мені особисто це alias =позначення набагато легше читати, ніж AS Alias. Детальніше про те, чому я віддаю перевагу, читайте в цій статті Аарона Бертрана.
GarethD

41

За допомогою функції DATEPART витягніть місяць із дати.

Отже, ви зробите щось подібне:

SELECT DATEPART(month, Closing_Date) AS Closing_Month, COUNT(Status) AS TotalCount
FROM t
GROUP BY DATEPART(month, Closing_Date)

14
Для Mysql ви можете використовувати MONTH () або MONTHNAME () замість DATEPART
frazras

Якщо ви часто виконуєте цей запит, спробуйте створити відповідний індекс.
user_0

Плюс 1 для простої відповіді.
berdem

9
Це вважало б місяці з різних років однаковими - що зазвичай НЕ очікувалося.
ivan_pozdeev

Це ставить "1" за січень і т.
Д.

14

Я використав функцію FORMAT для цього:

select
 FORMAT(Closing_Date, 'yyyy_MM') AS Closing_Month
 , count(*) cc 
FROM
 MyTable
WHERE
 Defect_Status1 IS NOT NULL
 AND Closing_Date >= '2011-12-01'
 AND Closing_Date < '2016-07-01' 
GROUP BY FORMAT(Closing_Date, 'yyyy_MM')
ORDER BY Closing_Month

9

Додавши MONTH(date_column)в GROUP BY.

SELECT Closing_Date, Category,  COUNT(Status)TotalCount
FROM   MyTable
WHERE  Closing_Date >= '2012-02-01' AND Closing_Date <= '2012-12-31'
AND    Defect_Status1 IS NOT NULL
GROUP BY MONTH(Closing_Date), Category

1

Функція DATEPART не працює на MySQL 5.6, замість цього використовуйте МІСЯЦЬ ('01.01.2018')


1

Спробуйте це:

select min(closing_date), date_part('month',closing_date) || '-' || date_part('year',closing_date) AS month,
Category, COUNT(Status)TotalCount 
FROM MyTable
where Closing_Date >= '2012-02-01' AND Closing_Date <= '2012-12-31'
AND Defect_Status1 is not null
GROUP BY month, Category,
ORDER BY 1

Таким чином ви групуєтесь за об’єднаним форматом дати, до якого приєднується -


0
SELECT  to_char(Closing_Date,'MM'), 
        Category,  
        COUNT(Status) TotalCount 
FROM    MyTable
WHERE   Closing_Date >= '2012-02-01' 
AND     Closing_Date <= '2012-12-31'
AND     Defect_Status1 IS NOT NULL
GROUP BY Category;

0

Версія SQL Server 2012 вище,

SELECT  format(Closing_Date,'yyyy-MM') as ClosingMonth,
        Category,  
        COUNT(Status) TotalCount 
FROM    MyTable
WHERE   Closing_Date >= '2012-02-01' 
AND     Closing_Date <= '2012-12-31'
AND     Defect_Status1 IS NOT NULL
GROUP BY format(Closing_Date,'yyyy-MM'), Category;

-1

Ви можете зробити це за допомогою Year (), Month () Day () та datepart ().

У вашому прикладі це буде:

select  Closing_Date, Category,  COUNT(Status)TotalCount from  MyTable
where Closing_Date >= '2012-02-01' and Closing_Date <= '2012-12-31' 
and Defect_Status1 is not null 
group by Year(Closing_Date), Month(Closing_Date), Category

Це не дійсний SQL
Mad Echet

Ну, це дійсно, але приносить непередбачувані результати, оскільки ви не групуєтесь за вибраними полями. Ви можете мати будь-яке значення на дату закриття, якщо дата та рік однакові.
Mad Echet

-1

Спробуйте наступний код

SELECT  Closing_Date = DATEADD(MONTH, DATEDIFF(MONTH, 0, Closing_Date), 0), 
        Category,  
        COUNT(Status) TotalCount 
FROM    MyTable
WHERE   Closing_Date >= '2012-02-01' 
AND     Closing_Date <= '2012-12-31'
AND     Defect_Status1 IS NOT NULL
GROUP BY DATEADD(MONTH, DATEDIFF(MONTH, 0, Closing_Date), 0), Category;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.