2009-04-30 21 views
20

Necesito lo siguienteContador SQL para cada fecha

Tengo una tabla de registro que registra los clientes potenciales generados cada día.

Ahora necesito obtener un informe sobre la cantidad de clientes potenciales para cada día en los últimos 10 días.

permite decir la tabla es el siguiente:

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

y tengo que contar el número de clientes potenciales para cada día, 10 días en total. por lo que el conjunto de resultados debe ser algo como esto:

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

... y así sucesivamente

Alguien sabe cómo hacer esto de la mejor manera posible? Mi solución actual es iterar con un foreach en C# pero me gustaría mucho entregarlo en el servidor sql en lugar de sp.

Respuesta

28

Se puede utilizar:

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

he utilizado esto, pero el created_date es un campo con una fecha y hora completa así que tuve que aplicar este pequeño truco: DATEADD (dd, 0, DATEDIFF (dd, 0 , created_date)) en el grupo por partes y todo funcionó como un encanto !! :) –

+1

También cambie el recuento (fecha_creado) al recuento (*). Contar con una columna solo cuenta los valores no nulos. Como tal, puede ser más lento que count (*) si la columna es nulable. – GilaMonster

+0

Incluso si esta pregunta/respuesta es bastante antigua: para obtener la fecha sin tiempo, puede usar DATE (fecha_crecida) en lugar de raw_dat_crecida, ¡por lo que los resultados se agruparán por fecha sin tiempo! – baris1892

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

Su campo es created_date datetime, por lo que tendrá que quitarse el tiempo antes de la agrupación funcionará si quiere ir por fecha:

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

su cláusula where aquí le dará potencialmente un valor parcial de días en el día más antiguo –

+1

. Esto funcionó muy bien para mí (menos la cláusula where) ¡gracias! – tree

2

Es más eficiente hacer su agregación por entero y luego volver a convertir a fecha y hora para la presentación.

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 
+0

int no funciona tan bien como ** varchar **. int a menudo agrupará las fechas juntas – tree

+0

También vi problemas con la conversión int. Tuve 6 registros en 2013/12/21 y la versión int arrojó un conteo de 1. La versión de Varchar arrojó un conteo de 6. – slolife

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 

sólo hay que poner este código y llame a la SP de esta manera

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

Gracias Suvabrata Roy ICRA Online Ltd. Kolkata

2

Cuando lanzas un DateTime a un int se "trunca" en mediodía, es posible que desee quitarse el día como

elenco (DATEADD (DAY, DATEDIFF (DAY, 0, created_date), 0) como int) como DayBucket

1

Tuve una pregunta similar, pero la mía implicaba una columna Convert (date, mydatetime). Tuve que alterar la mejor respuesta de la siguiente manera:

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