Недавно я создал запрос в SQL, который я могу использовать для просмотра нашего журнала платежей и определения среднего числа платежей, выполненных за час в течение определенного периода времени. Я уверен, что существуют сторонние приложения для составления отчетов, которые гораздо лучше подходят для выполнения того типа вычислений, который я пытаюсь выполнить, но просто для удовольствия, мне любопытно посмотреть, какие другие методы вы все можете использовать T-SQL), чтобы получить данные, которые я ищу. Я знаю, что это глупый вопрос, поэтому я не буду обижаться, если вы проголосуете против меня. Но для всех, кому скучно, как мне, не стесняйтесь размещать другие ваши решения.
Таблица настроена с помощью столбца [CreateDate], который представляет собой значение DATETIME, когда платеж публикуется в учетной записи. Я использую это, чтобы определить, в какой час они произвели оплату.
CREATE TABLE #TempTimes
(
[Time] DATETIME,
)
DECLARE @numDays INT
SET @numDays = 10
DECLARE @time DATETIME
SET @time = DATEADD(dd, DATEDIFF(dd, 0, GETDATE() - @numDays), 0)
WHILE @time < GETDATE()
BEGIN
INSERT #TempTimes
VALUES (@time)
SET @time = DATEADD(hour, 1, @time)
END
GO
/*
I have to join in a table with all of the hours for the time span I'm querying against,
because otherwise, the AVG function won't calculate in the hours where no payments were made.
*/
SELECT DATEPART(hour, [Time]) [Hour], AVG(CAST([Count] AS DECIMAL)) [Average]
FROM
(
SELECT [Time], CASE WHEN [Count] IS NULL THEN 0 ELSE [Count] END [Count]
FROM #TempTimes tt
LEFT JOIN
(
SELECT DATEADD(hour, DATEDIFF(hour, 0, [CreateDate]), 0) [hour], COUNT(*) [Count]
FROM [dbo].[PaymentLog]
GROUP BY DATEADD(hour, DATEDIFF(hour, 0, [CreateDate]), 0)
) t1 ON t1.[hour] = tt.[time]
) t2
GROUP BY DATEPART(hour, tt.[Time])
GO
DROP TABLE #TempTimes
GO
CJ