有没有一种方法可以使用指定的约束条件来计算SQL中的正确平均值?

时间:2019-07-10 03:15:12

标签: sql sql-server-2008

我需要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

我希望系统生成的平均余额为$ 1,800,000且在30天日历月中关闭了11天的帐户,SQL计算得出的平均值为$ 660,000。

类似地,我希望系统生成的平均余额为750,000美元且在30天历月结束前2天开设的帐户的SQL计算得出的平均值为45,000,000美元。

我希望SQL不会更改一个已开通30天的帐户的系统生成的平均值500,000。

谢谢。

1 个答案:

答案 0 :(得分:0)

让我们在这里讨论一些最佳做法:

首先,我建议您按照日期的存储方式存储关闭日期/打开日期,这将意味着您将“ 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,然后分别进行划分。

对于新帐户,您希望在此之前的每个月的每一天显示余额为“零”,然后用除以一个月中的总天数即可,您可以使用{ {1}}或使用函数DATEADD(DAY, -1, DATEADD(MONTH, 1, Date_you_need)),它将适当地返回28到31之间的整数值。但是,这仅对SQL Server 2012起有效,它似乎晚于您在问题中标记的版本。