2009-09-21 12 views
17

Tengo una tabla de registro en SQL Server que tiene este aspecto:grupo de SQL a día, con el recuento de

CREATE TABLE [dbo].[RefundProcessLog](
[LogId] [bigint] IDENTITY(1,1) NOT NULL, 
[LogDate] [datetime] NOT NULL, 
[LogType] [varchar](10) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, 
[RefundId] [int] NULL, 
[RefundTypeId] [smallint] NULL, 
[LogMessage] [varchar](1000) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, 
[LoggedBy] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, 
CONSTRAINT [PK_RefundProcessLog] PRIMARY KEY CLUSTERED 
(
[LogId] ASC 
) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

Lo que quiero es una lista de resultados que representa cómo se procesaron muchos refundids diferentes cada día , tirando cualquier NULLs.

¿Qué SQL necesitaría escribir para producir estos resultados?

Respuesta

39

me gusta este enfoque en (MS SQL) repiten:

SELECT 
    Convert(char(8), LogDate, 112), 
    count(distinct RefundId) 
FROM RefundProcessing 
GROUP BY Convert(char(8), LogDate, 112) 
0
Select count(*), LogDate, refundid from RefundProcessLog 
where refundid is not null 
group by LogDate, refundid 

Editar:

O colocar RefundID si no quiere que se descompone por reembolsos

+0

Esto no funcionará. Devolverá una fila con un recuento para cada valor distinto de refundid, que no es lo que se quiere. –

+0

Lea la edición que ya mencioné. – Gratzy

0

En SqlServer, sería algo así como:

select datepart(YEAR, [LogDate]), datepart(MONTH, [LogDate]), datepart(DAY, [LogDate]), count(refundid) as [Count] 
from [RefundProcessing] 
group by datepart(YEAR, [LogDate]), datepart(MONTH, [LogDate]), datepart(DAY, [LogDate]) 
6

Qué proveedor de base de datos ¿Estas usando? Sea lo que sea, reemplace la "DateOnly (LogDate)" en la siguiente con el construict apropiado para extraer la parte de fecha (quitarse el tiempo) desde el valor de la columna LogDate y luego tratar este:

Select [DateOnly(LogDate)], Count Distinct RefundId 
From RefundProcessLog 
Group By [DateOnly(LogDate)] 

En servidor SQL , por ejemplo, la construcción apropiada sería:

Select DateAdd(day, 0, DateDiff(day, 0, LogDate)), Count(Distinct RefundId) 
From RefundProcessLog 
Group By DateAdd(day, 0, DateDiff(day, 0, LogDate)) 
1
SELECT COUNT(RefundId), DateOnly(LogDate) LoggingDate 
FROM RefundProcessLog 
GROUP BY DateOnly(LogDate) 

"DateOnly" es específica para su base de datos SQL, que no se ha especificado.

Para SQL Server se puede utilizar DateAdd (dd, 0, DateDiff (dd, 0, LogDate)) para "DateOnly"

+0

Probablemente desee incluir la fecha en el conjunto de resultados. Según lo escrito, esto dará los números de ID de reembolso, pero no habrá forma de saber qué número ocurre en qué día. –

+0

@Steve: hecho :) – pbz

16
select cast(LogDate as date) as LogDate, count(refundId) as refundCount 
from yourTable 
group by cast(LogDate as date) 

Dependiendo del dialecto de SQL que está utilizando, es posible que tenga para cambiar el CAST a otra cosa. La expresión debe convertir el LogDate a un valor de solo fecha.

Además, si usted dice "diferente refundId" porque puede haber valores de refundId que sólo desea contar una vez, número de usos (refundId DISTINCT)

+1

gracias, este es el mejor para mí –

+1

El rendimiento de esto debería ser mucho mejor que la solución aceptada, que implica una conversión de cadena. – James

Cuestiones relacionadas