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を日付のみの値に変換する必要があります。
また、1回だけカウントしたい払い戻しIDの繰り返し値が存在する可能性があるために「別の払い戻しID」と言う場合は、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の場合、「DateOnly」にはDateAdd(dd、0、DateDiff(dd、0、LogDate))を使用できます
Select count(*), LogDate, refundid from RefundProcessLog
where refundid is not null
group by LogDate, refundid
編集:
または、払い戻しで分解したくない場合は、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])