SQL группа по дням, с количеством - PullRequest
19 голосов
/ 21 сентября 2009

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

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

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

Какой SQL мне нужно написать, чтобы получить эти результаты?

Ответы [ 6 ]

43 голосов
/ 22 сентября 2009

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

SELECT 
  Convert(char(8), LogDate, 112),
  count(distinct RefundId)
FROM RefundProcessing
GROUP BY Convert(char(8), LogDate, 112)
17 голосов
/ 21 сентября 2009
select cast(LogDate as date) as LogDate, count(refundId) as refundCount
from yourTable
group by cast(LogDate as date)

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

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

6 голосов
/ 21 сентября 2009

Какого поставщика базы данных вы используете? Что бы это ни было, замените «DateOnly (LogDate)» в следующем тексте соответствующим конструктивом, чтобы извлечь часть даты (исключить время) из значения столбца 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 голос
/ 21 сентября 2009
SELECT COUNT(RefundId), DateOnly(LogDate) LoggingDate
FROM RefundProcessLog
GROUP BY DateOnly(LogDate)

«DateOnly» относится к вашей базе данных SQL, которую вы не указали.

Для SQL Server вы можете использовать DateAdd (dd, 0, DateDiff (dd, 0, LogDate)) для «DateOnly»

0 голосов
/ 21 сентября 2009

В 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])
0 голосов
/ 21 сентября 2009
Select count(*), LogDate, refundid from RefundProcessLog
where refundid is not null
group by LogDate, refundid

Edit:

Или сбросьте RefundID, если вы не хотите, чтобы он был разбит по возвратам

...