繁体   English   中英

SQL 按天分组,带计数

[英]SQL group by day, with count

我在 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

我想要的是一个结果列表,它表示每天处理多少个不同的退款 ID,丢弃任何 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 转换为仅限日期的值。

另外,如果您说“不同的refundId”是因为您只想计算一次refundId 的重复值,请使用count(DISTINCTrefundId)

您使用的是哪个数据库供应商? 无论是哪一个,用适当的构造替换下面的“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))
SELECT COUNT(RefundId), DateOnly(LogDate) LoggingDate
FROM RefundProcessLog
GROUP BY DateOnly(LogDate)

“DateOnly”特定于您尚未指定的 SQL 数据库。

对于 SQL Server,您可以将 DateAdd(dd,0, DateDiff(dd,0,LogDate)) 用于“DateOnly”

SQL Server 2008 引入了date数据类型,这使得以下内容成为可能:

select convert(date, LogDate),
      ,count(refundid) AS 'refunds'
  from RefundProcessing
group by convert(date,LogDate)
order by convert(date,LogDate)

在 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])
Select count(*), LogDate, refundid from RefundProcessLog
where refundid is not null
group by LogDate, refundid

编辑:

或者如果您不希望它被退款分解,请删除 RefundID

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM