2009-04-30 101 views
20

我有以下需要每个日期的SQL计数

我有一个日志记录表,它记录每天生成的som线索。

现在我需要为过去10天内每天的潜在客户数量提供一份报告。

比方说表是这样的:

tbl_leads 
id int, 
first_name nvarchar(100), 
last_name nvarchar(100), 
created_date datetime 

,我需要计算导线的数量每一天,共10天。 所以结果集应该是这个样子:

counted_leads | count_date 
5    | 2009-04-30 
7    | 2009-04-29 
5    | 2009-04-28 
7    | 2009-04-27 

...等等

任何人都知道如何做到这一点的最好的方式? 我目前的解决方案是在c#中使用foreach进行迭代,但我非常想将它交给sql服务器,而不是在sp中。

回答

28

您可以使用:

Select 
    count(created_date) as counted_leads, 
    created_date as count_date 
from 
    table 
group by 
    created_date 
+4

我用这个,但CREATED_DATE是一个完整的日期时间所以现场我不得不申请这个小黑客: DATEADD(DD,0,DATEDIFF(DD,0 ,created_date)) 在一组一部分,它的一切都像一个魅力! :) – 2009-04-30 19:33:51

+1

也将计数(created_date)更改为计数(*)。用列计数只计算非空值。因此,如果列可以为空,它可能比count(*)慢。 – GilaMonster 2009-05-01 19:03:12

+0

即使这个问题/答案是相当古老的:要获得没有时间的日期,您可以使用DATE(created_date)而不是raw_date_date - 因此结果将按日期分组,无时间! – baris1892 2016-09-19 15:04:40

1
Select count(created_date) total 
    , created_dt 
    from table 
group by created_date 
order by created_date desc 
5

你CREATED_DATE场datetime,所以你需要剥离前的时间,如果你想按日期去分组将工作:

SELECT COUNT(created_date), created_date 
FROM table 
WHERE DATEDIFF(created_date, getdate()) < 10 
GROUP BY convert(varchar, created_date, 101) 
2

按整数进行聚合然后转换回日期时间以进行展示是最有效的。

select 
    cast(daybucket - 1 as datetime) as count_date, 
    counted_leads 
from 
    (select 
     cast(created_date as int) as DayBucket, 
     count(*) as counted_leads 
    from mytable 
    group by cast(created_date as int)) as countByDay 
1
CREATE PROCEDURE [dbo].[sp_Myforeach_Date] 
    -- Add the parameters for the stored procedure here 
    @SatrtDate as DateTime, 
    @EndDate as dateTime, 
    @DatePart as varchar(2), 
    @OutPutFormat as int 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    Declare @DateList Table 
    (Date varchar(50)) 

    WHILE @SatrtDate<= @EndDate 
    BEGIN 
    INSERT @DateList (Date) values(Convert(varchar,@SatrtDate,@OutPutFormat)) 
    IF Upper(@DatePart)='DD' 
    SET @SatrtDate= DateAdd(dd,1,@SatrtDate) 
    IF Upper(@DatePart)='MM' 
    SET @SatrtDate= DateAdd(mm,1,@SatrtDate) 
    IF Upper(@DatePart)='YY' 
    SET @SatrtDate= DateAdd(yy,1,@SatrtDate) 
    END 
    SELECT * FROM @DateList 
END 

只是把这个代码,并调用SP以这种方式

exec sp_Myforeach_Date @SatrtDate='03 Jan 2010',@EndDate='03 Mar 2010',@DatePart='dd',@OutPutFormat=106 

感谢 Suvabrata Roy ICRA Online Ltd. Kolkata

2

当你投一个DateTime为int它 “截断”中午,你可能想像这样脱光一天

cast(DATEADD(DAY,DATEDIFF(DAY,0,created_date),0)as DayBucket

1

我有类似的问题,但是我的列涉及Convert(date,mydatetime)列。我不得不改变最好的答案如下:

Select 
    count(created_date) as counted_leads, 
    Convert(date,created_date) as count_date 
from table 
group by Convert(date,created_date)