2012-10-28 40 views
5

Tôi đang cố gắng nhận được số lượng email nhận được trong một phạm vi ngày sử dụng MSSQL Express 2005. Tôi đã quản lý nhiều, nhưng bây giờ tôi muốn tách dữ liệu thành những gì đã được thực hiện với nó .SELECT COUNT trong phạm vi ngày

Đây là những gì tôi đã có cho đến nay:

SELECT EmailAddress, COUNT(EmailAddress) 
    FROM mails 
    WHERE ReceivedTime >= DATEADD(DAY, -7, GETDATE()) 
    GROUP BY EmailAddress 
    HAVING COUNT(EmailAddress) > 10 

Điều đó mang lại cho tôi một danh sách địa chỉ người gửi hơn 10 lần trong tuần trước, nhưng chúng tôi có một cột cho chúng ta biết những gì đã xảy ra với thư. Tôi đang cố gắng để đạt được một cái gì đó như thế này:

SELECT EmailAddress, 
    COUNT(ActionTaken WHERE ActionTaken="Deleted") AS Deleted, 
    COUNT(ActionTaken WHERE ActionTaken="Replied") AS Replied, 
    COUNT(ActionTaken WHERE ActionTaken="Read") AS Read, 
    COUNT(EmailAddress) AS Total 
    FROM mails 
    WHERE ReceivedTime >= DATEADD(DAY, -7, GETDATE()) 
    GROUP BY EmailAddress 
    HAVING COUNT(EmailAddress) > 10 

Tôi đang tìm kiếm một kết quả thiết lập dọc theo những dòng:

EmailAddress  | Deleted | Replied | Read | Total 
--------------------------------------------------- 
[email protected] | 4  | 5  | 3 | 12 
[email protected] | 2  | 6  | 3 | 11 

Tôi khá chắc chắn rằng nó có cái gì để làm với việc sử dụng OVER (PARTITION BY) mệnh đề, nhưng tôi đã đánh một bức tường. Tôi nhận ra trường ActionTaken không lý tưởng, nhưng tôi đã không xây dựng nó!

Trả lời

2

Sử dụng dấu nháy đơn cho chuỗi ký tự để nó hoạt động không phân biệt cài đặt QUOTED_IDENTIFIER.

SELECT EmailAddress, 
     Sum(CASE WHEN ActionTaken = 'Deleted' THEN 1 ELSE 0 END) AS Deleted, 
     Sum(CASE WHEN ActionTaken = 'Replied' THEN 1 ELSE 0 END) AS Replied, 
     Sum(CASE WHEN ActionTaken = 'Read' THEN 1 ELSE 0 END) AS [Read], 
     Count(EmailAddress) AS Total 
FROM mails 
WHERE ReceivedTime >= Dateadd(DAY, -7, Getdate()) 
GROUP BY EmailAddress 
HAVING Count(EmailAddress) > 10 
+0

Bạn chỉ cứu tôi điều gì sẽ gần như chắc chắn đã được cả một ngày cố gắng để có được đầu của tôi xung quanh chức năng tổng hợp vì lợi ích của cái gì đó trông đơn giản như vậy bây giờ tôi nhìn thấy nó! Cảm ơn bạn, hoạt động hoàn hảo! – timbstoke

+0

@timbstoke - Rất vui được trợ giúp. Bạn cũng có thể sử dụng 'PIVOT' nhưng tôi thích phương thức' CASE' dễ nhớ hơn và linh hoạt hơn. Ngoài ra với 'PIVOT', thêm các cột bổ sung vào bảng cơ sở có thể phá vỡ truy vấn trừ khi bạn cẩn thận sử dụng một bảng có nguồn gốc hoặc CTE chỉ với các cột có liên quan làm nguồn. –

1
SELECT EmailAddress, 
     COUNT(CASE WHEN ActionTaken = 'Deleted' THEN ActionTaken END) AS Deleted, 
     COUNT(CASE WHEN ActionTaken = 'Replied' THEN ActionTaken END) AS Replied, 
     COUNT(CASE WHEN ActionTaken = 'Read' THEN ActionTaken END) AS [Read], 
     COUNT(EmailAddress) AS Total 
FROM mails 
WHERE ReceivedTime >= DATEADD(DAY, -7, GETDATE()) 
GROUP BY EmailAddress 
HAVING COUNT(EmailAddress) > 10 
Các vấn đề liên quan