Cách nhóm theo tháng từ trường Ngày sử dụng sql


84

Làm cách nào để chỉ nhóm theo tháng từ trường ngày (chứ không phải nhóm theo ngày)?

Đây là trường ngày của tôi trông như thế nào:

2012-05-01

Đây là SQL hiện tại của tôi:

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

Câu trả lời:


108

Tôi sẽ sử dụng cái này:

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;

Điều này sẽ nhóm vào ngày đầu tiên của mỗi tháng, vì vậy

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

sẽ cho '20130101'. Tôi thường thích phương pháp này vì nó giữ ngày tháng.

Ngoài ra, bạn có thể sử dụng một cái gì đó như sau:

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;

Nó thực sự phụ thuộc vào đầu ra mong muốn của bạn là gì. (Năm kết thúc không cần thiết trong ví dụ của bạn, nhưng nếu phạm vi ngày vượt qua ranh giới năm thì có thể là như vậy).


GarethD, cảm ơn người đàn ông cả hai phương pháp làm việc tốt. Có cách nào để tôi có thể nhóm cả năm và tháng lại với nhau trong một trường không? Có nghĩa là hiển thị như dạng này: Dec-12 (Tháng mười hai là tháng và 12 là năm). cảm ơn
user1858332 28/01

Phương pháp đầu tiên sẽ thực hiện việc này, bạn chỉ cần định dạng cột. Tôi muốn tư vấn làm bên ngoài này của SQL, nhưng nếu nó đã được thực hiện như vậy, bạn có thể sử dụng giống nhưSELECT STUFF(SUBSTRING(CONVERT(VARCHAR, CURRENT_TIMESTAMP, 6), 4, 6), 4, 1, '-');
GarethD

@GarethD Bạn có thể giải thích cách bạn vừa sử dụng dateiff giữa 0 và date không. 0 không phải là một ngày.
irfandar

1
và cũng có gì Closing_Date = DATEADD (MONTH, DATEDIFF (MONTH, 0, Closing_Date), 0) làm tại sao không chỉ DATEADD (MONTH, DATEDIFF (MONTH, 0, Closing_Date), 0)
irfandar

3
@irfandar 0 không phải là ngày, nhưng SQL-Server ngầm chuyển đổi nó thành ngày 1 tháng 1 năm 1900. Đối với câu hỏi thứ hai của bạn Closing_Date =chỉ là bí danh cột, nó giống như có AS Closing_Datesau biểu thức. Đó là hoàn toàn chủ quan nhưng cá nhân tôi thấy alias =ký hiệu dễ đọc hơn nhiều AS Alias. Để biết thêm về lý do tại sao tôi thích nó hơn, hãy đọc bài viết này của Aaron Bertrand.
GarethD

41

Sử dụng hàm DATEPART để trích xuất tháng từ ngày.

Vì vậy, bạn sẽ làm một cái gì đó như thế này:

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

14
Đối với Mysql bạn có thể sử dụng MONTH () hoặc MONTHNAME () thay vì DATEPART
frazras

Nếu bạn chạy truy vấn này thường xuyên, hãy cân nhắc để xây dựng một chỉ mục thích hợp.
user_0

Cộng 1 để trả lời đơn giản.
berdem

9
Điều này sẽ coi các tháng từ các năm khác nhau là như nhau - điều này thường KHÔNG được mong đợi.
ivan_pozdeev

Puts này "1" cho Tháng Một vv .. Nó không cho bạn biết tên tháng
user890332

14

Tôi đã sử dụng hàm FORMAT để thực hiện điều này:

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

Bằng cách thêm MONTH(date_column)vào 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

Hàm DATEPART không hoạt động trên MySQL 5.6, thay vào đó hãy sử dụng MONTH ('2018-01-01')


1

Thử đi:

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

Bằng cách này, bạn đang nhóm theo định dạng ngày được nối, được nối bằng dấu -


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

Phiên bản SQL Server 2012 ở trên,

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

Bạn có thể thực hiện việc này bằng cách sử dụng Năm (), Tháng () Ngày () và datepart ().

Trong ví dụ của bạn, điều này sẽ là:

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

Đây không phải là SQL hợp lệ
Mad Echet

Vâng, điều này hợp lệ nhưng mang lại kết quả không thể đoán trước vì bạn không nhóm theo các trường mà bạn chọn. Bạn có thể có bất kỳ giá trị nào trong ngày kết thúc miễn là ngày và năm giống nhau.
Mad Echet

-1

Hãy thử mã sau

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;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.