您好我有一个表,如下所示:
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
我需要做的就是所传递的总金额,失败了,每天PENDING finalStatus的月供。 我曾试图改变人们在以前的答案,例如这已经给MySQL代码: SQL查询计算,每天订单的总号? 但一直没能得到它的工作。
这里是我到目前为止的代码:
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))
如果有人可以帮助我,将是惊人的。 我一直停留在这个现在几个小时,可能很快就会发疯...
Answer 1:
由于这是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)
http://www.sqlfiddle.com/#!3/dc195/4
Answer 2:
你可以每个月不同的是这样的:
SELECT year(datestart), month(datestart)
finalStatus,
COUNT(finalStatus)
FROM [Emails]
GROUP BY year(datestart), month(datestart),finalStatus
和分组像这是一个更快的方法,比subquerying。
Answer 3:
我想你需要的东西是这样的:
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小提琴
Answer 4:
尝试这个
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))
Answer 5:
如果你只是想有一个交易的日期, 无视这个答案,因为这两个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]
Answer 6:
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
这取决于你的应用程序如何提供必要的一年情况。
SQL小提琴
文章来源: How to get totals per day