Есть ли способ рассчитать правильное среднее значение в SQL, используя указанные ограничения? - PullRequest
1 голос
/ 10 июля 2019

Мне нужен SQL, чтобы определить правильное среднее значение для всех клиентов, которые открыли или закрыли учетную запись в течение предыдущего месяца. Этот расчет является частью гораздо большей ежемесячной выписки. Кроме того, мне нужны выходные данные, чтобы не изменять среднее сальдо по всем ранее существующим счетам, которые не открывались или не закрывались в течение предыдущего месяца (из-за неопределенности в заявлении по делу).

В настоящее время наша система вычисляет среднее значение на конец месяца, делая снимок любого среднего остатка в день закрытия или открытия счета. Но это неточно, поскольку он присваивает «кредит» за полный месяц, когда счет может быть открыт только на один день или 15 дней (и т. Д.) В течение месяца.

Базовая математика говорит мне, что мне нужно вычислить средние значения таким образом:

average_balance * days_open_in_month_closed/days_in_month (for closed accounts) 

average_balance * days_open_in_month_new/days_in_month (for new accounts) 

Я написал 3 подзапроса в моем более крупном запросе, чтобы получить данные для всех компонентов день / дата; однако я сталкиваюсь с границами моих знаний SQL. По сути, я не уверен, как собрать все воедино: я не знаю, как вставить вычисление среднего значения, как привести все в один подзапрос (если можно / нужно) и т. Д.

,(SELECT DAY(DATEADD(DD,-1,DATEADD(MM,DATEDIFF(MM,0,  GETDATE()), 0)))) AS days_in)month
,(SELECT DATEDIFF(DAY,DATEADD(month, DATEDIFF(month, -1, getdate()) -2, 0),closed_date) AS days_opened_in_month_closed
,(SELECT DATEDIFF(DAY,DATEADD(month, DATEDIFF(month, -1, getdate()) -2,0,),open_date) AS days_open_in_month_new

Я ожидаю, что SQL рассчитывает среднее значение в 660 000 долларов США для учетной записи с системным средним балансом в 1 800 000 долларов США, который закрыл 11 дней в 30-дневном календарном месяце.

Аналогичным образом, я ожидаю, что в SQL рассчитывается среднее значение 45 000 000 долларов США для учетной записи со сгенерированным системой средним балансом 750 000 долларов США, который открывается за 2 дня до окончания 30-дневного календарного месяца.

Я ожидаю, что SQL не изменит сгенерированное системой среднее значение 500 000 для учетной записи, которая была открыта в течение полных 30 дней месяца.

Заранее спасибо.

1 Ответ

0 голосов
/ 10 июля 2019

Давайте поговорим о некоторых лучших практиках здесь:

Во-первых, я бы порекомендовал вам хранить дату закрытия / открытия даты, как предполагается, как вы, похоже, храните ее, что подразумевает, что вы сохраняете "days_in_month_closed "в качестве параметра.Чтобы сэкономить некоторое время преобразования в будущем, убедитесь, что вы используете стандартную строку метки времени (целые числа unixtime должны помочь).

Далее вы должны использовать DATEDIFF().Если вы хотите увидеть количество дней между началом месяца и датой закрытой клиентской учетной записи, вы должны написать это

SELECT 
   DATEDIFF(day,
           `account_closed_date`
           CAST(CONCAT(YEAR(`account_closed_date),"-",MONTH(`account_closed_day`),"-01") AS date)  
FROM `accounts_table`

Этот запрос вернет число дней в виде целого числа междупервый и ожидаемый день месяца.

Если бы вы хотели найти начало следующего месяца, вы бы сделали нечто подобное

SELECT 
   DATEDIFF(day,
           `account_open_date`
           DATEADD(MONTH, 1, CAST(CONCAT(YEAR(`account_open_date),"-",MONTH(`account_open_day`),"-01") AS date)))
FROM `accounts_table`

С этими вычисленными числами вы можете затем выполнитьсумму таблицы баланса и используйте ее в качестве знаменателя.

SELECT 
   (Select AVG(balance) From balances)/
   DATEDIFF(day,
           `account_open_date`
           DATEADD(MONTH, 1, CAST(CONCAT(YEAR(`account_open_date),"-",MONTH(`account_open_day`),"-01") AS date)))
FROM `accounts_table` at
Join balances b on at.account_id = b.account_id;

Это, конечно, при условии, что вам нужно рассчитать среднее сальдо на счет в этом запросе.Хотя лучшей практикой будет вычисление двух чисел отдельно (т. Е. Одного как Total Balance in the month и одного как days account was active in the month для каждой учетной записи, а затем разделить их отдельно.

Для новой учетной записи вы хотите показатьесли баланс равнялся нулю каждый день месяца до этого, то вы просто поделили бы его на общее количество дней в месяце, которое вы можете найти с помощью DATEADD(DAY, -1, DATEADD(MONTH, 1, Date_you_need)) или с помощью функции Day(EOMONTH(date_you_needed)), котораяверните целочисленное значение в диапазоне от 28 до 31. Однако это верно только для SQL Server 2012, который, кажется, позже, чем версия, которую вы отметили в вопросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...