Счетчик SQL для каждой даты - PullRequest
23 голосов
/ 30 апреля 2009

У меня есть следующая потребность

У меня есть таблица журналов, в которой регистрируются сом-лиды, генерируемые каждый день.

Теперь мне нужно получить отчет о количестве лидов за каждый день за последние 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

... и т. Д.

Кто-нибудь знает, как сделать это наилучшим из возможных способов? Мое текущее решение - итерация с foreach в c #, но я бы очень хотел передать его на сервер sql вместо sp.

Ответы [ 7 ]

31 голосов
/ 30 апреля 2009

Вы можете использовать:

Select
     count(created_date) as counted_leads,
     created_date as count_date
from
     table
group by
     created_date
5 голосов
/ 30 апреля 2009

Ваше поле create_date datetime, поэтому вам нужно будет сократить время до того, как сработает группировка, если вы хотите перейти по дате:

SELECT COUNT(created_date), created_date 
FROM table 
WHERE DATEDIFF(created_date, getdate()) < 10
GROUP BY convert(varchar, created_date, 101)
2 голосов
/ 05 ноября 2012

Когда вы приводите DateTime к int, он «усекает» в полдень, вы можете захотеть вырезать день так, как это было

cast(DATEADD(DAY, DATEDIFF(DAY, 0, created_date), 0) as int) as DayBucket
2 голосов
/ 01 мая 2009

Наиболее эффективно выполнить агрегирование по целому числу и затем преобразовать обратно в дату и время для представления.

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 голос
/ 26 сентября 2014

У меня был похожий вопрос, но мой был связан с колонкой 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)
1 голос
/ 23 декабря 2010
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

Спасибо Сувабрата Рой ICRA Online Ltd. Калькутта

1 голос
/ 30 апреля 2009
Select count(created_date) total
     , created_dt
  from table
group by created_date
order by created_date desc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...