у меня есть следующая потребность
У меня есть таблица регистрации, в которой каждый день регистрируются лиды.
Теперь мне нужно получить отчет о количестве потенциальных клиентов за каждый день за последние 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 в С#, но я бы очень хотел передать его на сервер sql, а не в sp.
Ответ 2 · рейтинг 9 · Dave Swersky
Ваше поле created_date имеет значение datetime, поэтому вам нужно удалить время, прежде чем группировка будет работать, если вы хотите идти по дате:
SELECT COUNT(created_date), created_date
FROM table
WHERE DATEDIFF(created_date, getdate()) < 10
GROUP BY convert(varchar, created_date, 101)
Ответ 3 · рейтинг 3 · ahains
Наиболее эффективно выполнять агрегацию по целому числу, а затем преобразовывать обратно в дату и время для представления.
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
Ответ 4 · рейтинг 2 · user3411804
У меня был аналогичный вопрос, однако мой касался столбца 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)
Ответ 5 · рейтинг 2 · Niclas Lindgren
Когда вы переводите DateTime в int, он "усекается" в полдень, вы можете захотеть вырезать день так
cast(DATEADD(DAY, DATEDIFF(DAY, 0, created_date), 0) as int) as DayBucket
Ответ 6 · рейтинг 1 · Suvabrata Roy
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. Калькутта