您好我有一张如下表所示的表格:
Table Name: Emails
ID |CreatedDate |finalStatus
115173922 |2013-04-09 12:33:23.234 |DELIVERED
115123432 |2013-04-09 08:21:23.234 |FAILED
115143212 |2013-04-09 12:24:23.234 |DELIVERED
115173922 |2013-04-09 05:05:23.234 |DELIVERED
111233922 |2013-04-10 12:44:23.234 |PENDING
115123912 |2013-04-10 12:05:23.234 |DELIVERED
115173922 |2013-04-11 22:09:23.234 |DELIVERED
111233922 |2013-04-11 13:05:23.234 |PENDING
115123912 |2013-04-11 05:23:23.234 |DELIVERED
我需要做的是获取当月每天的DELIVERED,FAILED和PENDING finalStatus的总金额。我试图修改人们在之前的答案中给出的MySQL代码,例如:SQL query for Calculating Total No. of Orders per Day?但是无法使其正常工作。
这是我到目前为止的代码:
SELECT DISTINCT (CAST(CreatedDate as DATE)) as Date,
(SELECT COUNT(finalStatus)
FROM [Emails]
WHERE finalStatus = 'DELIVERED') AS Delivered,
(SELECT COUNT(finalStatus)
FROM [Emails]
WHERE finalStatus = 'FAILED') AS Failed,
(SELECT COUNT(finalStatus)
FROM [Emails]
WHERE finalStatus = 'PENDING') AS Pending
FROM [Emails]
GROUP BY (CAST(CreatedDate as DATE))
如果有人能帮助我那将是惊人的。我已经被困在这几个小时了,很快就会发疯...
答案 0 :(得分:2)
由于这是SQL Server 2008
,因此请仅使用CREATEDDATE
将DATE
投射到CAST()
,
SELECT CAST(E.CreatedDate AS DATE) DateCreated,
COUNT(case when E.finalStatus = 'DELIVERED' then 1 end) as DELIVERED,
COUNT(case when E.finalStatus = 'FAILED' then 1 end) as FAILED,
COUNT(case when E.finalStatus = 'PENDING' then 1 end) as PENDING
FROM TableName E
GROUP BY CAST(E.CreatedDate AS DATE)
答案 1 :(得分:1)
我认为你需要这样的东西:
<强> DATENAME 强>
select CAST(CreatedDate as DATE),
sum(case when E.finalStatus = 'DELIVERED' then 1 else 0 end) as DELIVERED,
sum(case when E.finalStatus = 'FAILED' then 1 else 0 end) as FAILED,
sum(case when E.finalStatus = 'PENDING' then 1 else 0 end) as PENDING
from Emails E
where DATENAME(MONTH,E.CreatedDate)='your month name'
group by CAST(E.CreatedDate as DATE)
<强> SQL Fiddle 强>
答案 2 :(得分:1)
你可以像这样每个月不同:
SELECT year(datestart), month(datestart)
finalStatus,
COUNT(finalStatus)
FROM [Emails]
GROUP BY year(datestart), month(datestart),finalStatus
像这样分组比明确更快。
答案 3 :(得分:0)
试试这个
SELECT DISTINCT (CAST(CreatedDate as DATE)) as Date,
(SELECT COUNT(finalStatus)
FROM [Emails] E1
WHERE finalStatus = 'DELIVERED' AND
CAST(E1.CreatedDate as DATE) = CAST(E.CreatedDate as DATE)) AS Delivered,
(SELECT COUNT(finalStatus)
FROM [Emails] E2
WHERE finalStatus = 'FAILED' AND
CAST(E2.CreatedDate as DATE) = CAST(E.CreatedDate as DATE)) AS Failed,
(SELECT COUNT(finalStatus)
FROM [Emails] E3
WHERE finalStatus = 'PENDING' AND
CAST(E3.CreatedDate as DATE) = CAST(E.CreatedDate as DATE)) AS Pending
FROM [Emails] E
GROUP BY (CAST(CreatedDate as DATE))
答案 4 :(得分:0)
with daily_figures as
(
select
cast(CreatedDate as date) as CreatedDate,
finalStatus,
Count(*) as DayCount
From
EMails
Group
by cast(CreatedDate as date), FinalStatus
)
select * from daily_figures
Where
datepart(month, CreatedDate) = 4 and
datepart(year, CreatedDate) = 2013
取决于您的申请情况,您如何提供必要的年份。
答案 5 :(得分:0)
如果您只想获取有交易的日期,会忽略此答案,因为LUV
和Skinny Pipes
已经证明了。
考虑到您希望获得APRIL
整个月的所有日期,您需要先为整个月APRIL
生成一个日历表,然后将其与您的表联系起来。此查询使用递归CTE创建日历。
WITH April_Calendar
AS
(
SELECT CAST('20130401' as datetime) AS [date]
UNION ALL
SELECT DATEADD(dd, 1, [date])
FROM April_Calendar
WHERE DATEADD(dd, 1, [date]) <= '20130430'
)
SELECT a.[Date] DateCreated,
COUNT(case when E.finalStatus = 'DELIVERED' then 1 end) as DELIVERED,
COUNT(case when E.finalStatus = 'FAILED' then 1 end) as FAILED,
COUNT(case when E.finalStatus = 'PENDING' then 1 end) as PENDING
FROM April_Calendar a
LEFT JOIN Emails E
ON a.[date] = CAST(E.CreatedDate AS DATE)
GROUP BY a.[Date]