Ответ 1
Мне нравится этот подход в (MS SQL):
SELECT
Convert(char(8), LogDate, 112),
count(distinct RefundId)
FROM RefundProcessing
GROUP BY Convert(char(8), LogDate, 112)
У меня есть таблица журналов в 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 мне нужно написать для создания этих результатов?
Мне нравится этот подход в (MS SQL):
SELECT
Convert(char(8), LogDate, 112),
count(distinct RefundId)
FROM RefundProcessing
GROUP BY Convert(char(8), LogDate, 112)
select cast(LogDate as date) as LogDate, count(refundId) as refundCount
from yourTable
group by cast(LogDate as date)
В зависимости от диалекта SQL, который вы используете, вам может потребоваться изменить CAST на что-то еще. Выражение должно преобразовать значение LogDate в значение даты.
Кроме того, если вы скажете "different refundId", потому что могут быть повторные значения refundId, которые вы хотите подсчитать только один раз, используйте count (DISTINCT refundId)
Какой поставщик базы данных вы используете? Какой бы он ни был, замените "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))
SELECT COUNT(RefundId), DateOnly(LogDate) LoggingDate
FROM RefundProcessLog
GROUP BY DateOnly(LogDate)
"DateOnly" относится к вашей базе данных SQL, которую вы не указали.
Для SQL Server вы можете использовать DateAdd (dd, 0, DateDiff (dd, 0, LogDate)) для "DateOnly"
Select count(*), LogDate, refundid from RefundProcessLog
where refundid is not null
group by LogDate, refundid
Edit:
Или отмените RefundID, если вы не хотите, чтобы он был скомпенсирован возвратом средств
В 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])