2009-09-21 11 views
17

Mam tabelę dziennika w SQL Server, który wygląda tak:SQL grupy na dzień, z liczbą

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 

Co chcę znajduje się lista wyników, które reprezentuje, jak wiele różnych refundids były przetwarzane każdy dzień , wyrzucając wszelkie NULLy.

Jakiego kodu SQL powinienem napisać, aby uzyskać te wyniki?

Odpowiedz

39

ja lubię tego podejścia (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:

lub spadek RefundID jeśli nie chcesz go w podziale na refundacji

+0

To nie zadziała. Zwróci wiersz z liczbą dla każdej odrębnej wartości zwrotu, która nie jest zgodna z oczekiwaniami. –

+0

Przeczytaj wersję, o której już wspomniałem. – Gratzy

0

W SqlServer, byłoby coś jak:

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

Co dostawcy baza danych czy używasz? Niezależnie od tego, że jest zastąpienie „DateOnly (LogDate)” poniżej w odpowiednim CONSTRUICT wyodrębnić fragment datę (odpędzenia godzinę) od wartości kolumny logdate a następnie spróbuj to:

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

serwer SQL dla np, odpowiednia konstrukcja będzie:

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” jest specyficzna dla bazy danych SQL, które nie zostały podane.

Dla SQL Server można użyć DateAdd (dd, 0, DateDiff (dd, 0, LogDate)) dla "DateOnly"

+0

Prawdopodobnie chcesz uwzględnić datę w zestawie wyników. Jak napisano, da to numery identyfikatorów refundacji, ale nie będzie możliwości sprawdzenia, który numer pojawi się w danym dniu. –

+0

@Steve: done :) – pbz

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

zależności od dialektu SQL, którego używasz, może być zmienić CAST na coś innego. Wyrażenie powinno przekonwertować wartość LogDate na wartość tylko do daty.

Ponadto, jeśli powiesz „inny refundId”, ponieważ nie może być powtórzone wartości refundId że chcesz tylko liczyć raz hrabia użytkowania (DISTINCT refundId)

+1

dziękuje człowieku, ten jest dla mnie najlepszy –

+1

Wydajność tego powinna być znacznie lepsza niż przyjęte rozwiązanie, co wiąże się z konwersją ciągów. – James