#sql-server
#sql-сервер
Вопрос:
У меня есть куча столбцов count, отправляемых за каждый день, поэтому я должен суммировать их за весь месяц, а затем выполнить деление, чтобы найти общее количество по месяцам. как мне получить расчет всех трех вычислений по месяцам
Ниже приведены поля, которые я пытаюсь вычислить, как мне суммировать записи за весь месяц:
CAST([Sid_Count] / NULLIF([Wrk_Count], 0) AS DECIMAL(18, 4)) AS Quality_Field,
CAST([Talk_Count] / NULLIF([Sid_Count], 0) AS DECIMAL(18, 4)) AS Utilization_Field,
CAST([Cell_Count] / NULLIF([Cell_No_Count] Cell_No_Count, 0) AS DECIMAL(18, 4)) AS Consent_Field
Пример того, что я пытаюсь увидеть: расчет с 8 января по 8 февраля
DateByMonth Quality_Field Utilization_Field Consent_Field
2021-02-08 Total count by month Total count by month Total count by month
Комментарии:
1.
GROUP BY EOMONTH(myDate)
?2. Пожалуйста, покажите некоторые примеры данных и ожидаемый результат. Это поможет нам лучше понять ваш вопрос
3. Call_Date Quality_Field Использование поля Consent_Field 2020-02-10 NULL 0.0000 0.0000 2020-02-10 NULL 0.0000 2.0000 2020-02-11 NULL 0.0000 NULL 2020-02-11 NULL 0.0000 NULL
Ответ №1:
DECLARE @derivedDateStart DATE = '1/1/2015' --Set as far back as needed
DECLARE @derivedDateEnd DATE = getdate()
CREATE TABLE #tempDerivedMonth (tYear int, tMonth int)
WHILE @derivedDateStart < @derivedDateEnd
BEGIN
INSERT INTO #tempDerivedMonth(tYear, tMonth)
SELECT YEAR(@derivedDateStart, MONTH(@derivedDateStart))
SET DATEADD(m,1,@derivedDateStart)
END
SELECT CONVERT(VARCHAR,CONVERT(DATE,CONVERT(VARCHAR,MONTH(myDate)) '/' CONVERT(VARCHAR,DAY(getdate())) '/' CONVERT(VARCHAR,YEAR(myDate))),23) AS DateByMonth,
SUM(CAST([Sid_Count] / NULLIF([Wrk_Count], 0) AS DECIMAL(18, 4))) AS Quality_Field,
SUM(CAST([Talk_Count] / NULLIF([Sid_Count], 0) AS DECIMAL(18, 4))) AS Utilization_Field,
SUM(CAST([Cell_Count] / NULLIF([Cell_No_Count] Cell_No_Count, 0)) AS DECIMAL(18, 4)) AS Consent_Field
FROM YourTable yt
JOIN #tempDerivedMonth tdm
ON tdm.tMonth = MONTH(myDate) AND tdm.tYear = YEAR(myDate) AND DAY(myDate) BETWEEN DAY(getdate()) and DATEADD(d,1,DATEADD(m,-1,getdate()))
GROUP BY CONVERT(VARCHAR,CONVERT(DATE,CONVERT(VARCHAR,MONTH(myDate)) '/' CONVERT(VARCHAR,DAY(getdate())) '/' CONVERT(VARCHAR,YEAR(myDate))),23)
Предполагая, что у вас есть столбец даты с именем myDate, ваше решение может выглядеть примерно так (запутаннее, чем хотелось бы). Для группировки по производному месяцу, я думаю, вам понадобится таблица календаря, например, #tempDerivedMonth . Суммирование ваших уравнений позволяет вам группировать выходные данные в вашем операторе From . Любопытно узнать, работает ли это для вас. (спасибо Рейчел за приглашение расширить первоначальный ответ)
Комментарии:
1. Пожалуйста, добавьте объяснение того, почему вышеизложенное может сработать. это улучшит качество вашего ответа