2009-09-21 3 views
17

У меня есть таблицы журнала в SQL Server, который выглядит следующим образом:SQL группы в день, со счетом

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 

То, что я хочу, это список результатов, который представляет, сколько различных refundids обрабатывали каждый день , выкидывая любые NULL.

Какой SQL мне нужно написать для создания этих результатов?

ответ

39

Мне нравится этот подход (MS SQL):

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 

Edit:

Или падение RefundID, если вы не хотите, с разбивкой по возвратам

+0

Это не сработает. Он вернет строку со счетом для каждого отдельного значения refundid, чего не требуется. –

+0

Прочтите изменение, о котором я уже упоминал. – Gratzy

0

В SqlServer, это было бы что-то вроде:

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

Что поставщик базы данных ты используешь? Какой бы это, заменить «DateOnly (LogDate)» в следующем с соответствующим construict, чтобы извлечь часть даты (сдирать время) от значения столбца logdate, а затем попробовать это:

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

В сервере Sql , например, в силу соответствующая конструкция будет:

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» является специфичным для базы данных SQL, которые вы не указали.

Для SQL Server можно использовать DateAdd (дд, 0, DateDiff (дд, 0, LogDate)) для "DateOnly"

+0

Возможно, вы захотите включить дату в результирующий набор. Как написано, это даст количество возвратов, но не будет способа узнать, какое число происходит в тот день. –

+0

@Steve: done :) – pbz

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

В зависимости от диалекта SQL, который вы используете, вы можете иметь изменить CAST на что-то еще. Выражение должно преобразовать значение LogDate в значение только для даты.

Кроме того, если вы говорите, «другое refundId», потому что там может быть повторен значения refundId, что вы только хотите посчитать один раз, количество использования (DISTINCT refundId)

+1

спасибо, этот человек работает для меня лучший –

+1

Выполнение этого должно быть намного лучше, чем принятое решение, которое включает в себя преобразование строк. – James

Смежные вопросы