Вычисление записей для каждого вычисления по месяцам

#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. Пожалуйста, добавьте объяснение того, почему вышеизложенное может сработать. это улучшит качество вашего ответа