Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
结合MAX和SUM的SQL_Sql_Sql Server_Sum_Subquery_Greatest N Per Group - Fatal编程技术网

结合MAX和SUM的SQL

结合MAX和SUM的SQL,sql,sql-server,sum,subquery,greatest-n-per-group,Sql,Sql Server,Sum,Subquery,Greatest N Per Group,因此,我有一个SQL表,其中包含以下列: License# - int Name - char(255) ActivityDate - datetime FundsIn - money,null 大约有2800个独特的许可证号码,每天将有大量资金。我正在试图找到上次有活动的日期(ActivityDate)以及在最大ActivityDate上所有资金的总和 下面是一个我一直试图修改以使其正常工作的查询,但它返回的是所有日期的许可证号之和,而不仅仅是最大日期 Select License, Nam

因此,我有一个SQL表,其中包含以下列:

License# - int
Name - char(255)
ActivityDate - datetime
FundsIn - money,null
大约有2800个独特的许可证号码,每天将有大量资金。我正在试图找到上次有活动的日期(ActivityDate)以及在最大ActivityDate上所有资金的总和

下面是一个我一直试图修改以使其正常工作的查询,但它返回的是所有日期的许可证号之和,而不仅仅是最大日期

Select License, Name, MAX(ActivityDate), FundsIn
From (
    Select License, Name, ActivityDate, SUM(FundsIn) as Funds_In
    From Table1
    group by License, Name, ActivityDate
) foo
group by License, Name, FundsIn
我知道当前查询的问题是它正在对FundsIn的整个数据集进行分组,但我不知道如何将FundsIn的总和限制为仅最大日期。任何帮助都将不胜感激

样本日期

License   Name   ActivityDate   FundsIn
123       A      8/29/2020      40
123       A      8/29/2020      60
123       A      8/29/2020      80
123       A      8/29/2020      55
123       A      8/30/2020      10
123       A      8/30/2020      15
123       A      8/30/2020      12
123       A      8/30/2020      60
123       A      8/30/2020      70
234       B      8/29/2020      12
234       B      8/29/2020      15
234       B      8/29/2020      19
234       B      8/29/2020      22
234       B      8/29/2020      33
234       B      8/30/2020      13
234       B      8/30/2020      78
234       B      8/30/2020      28
234       B      8/30/2020      34
234       B      8/30/2020      46
在上面的数据中,查询将返回下面的

License   Name   ActivityDate   FundsIn
123       A      8/30/2020      167
234       B      8/30/2020      199

我想你在找这样的东西。CTE使用行号查找每个许可证的最大活动日期。然后,在许可证和活动日期(最大值)将CTE合并回表1


我想你在找这样的东西。CTE使用行号查找每个许可证的最大活动日期。然后,在许可证和活动日期(最大值)将CTE合并回表1


我知道您想要每个许可证在最新活动日期的资金总额(并非所有许可证每天都处于活动状态)

有多种方式来表达这一点。一种方法是具有相关子查询的筛选器:

select license, name, activityDate, sum(fundsIn) fundsIn
from mytable t
where t.activityDate = (select max(t1.activityDate) from mytable t1 where t1.license = t.license)
group by license, name, activityDate
在其他选项中,一个更奇特的选择是按顺序排列的
和带领带的
顶部(1)

select top (1) with ties license, name, activityDate, sum(fundsIn) fundsIn
from mytable t
group by license, name, activityDate
order by row_number() over(partition by license order by activityDate desc) 

我认为第二种方法在大型数据集上的效率较低。

我知道您希望每个许可证的最新活动日期的资金总额(并非所有许可证每天都处于活动状态)

有多种方式来表达这一点。一种方法是具有相关子查询的筛选器:

select license, name, activityDate, sum(fundsIn) fundsIn
from mytable t
where t.activityDate = (select max(t1.activityDate) from mytable t1 where t1.license = t.license)
group by license, name, activityDate
在其他选项中,一个更奇特的选择是按
顺序排列的
和带领带的
顶部(1)

select top (1) with ties license, name, activityDate, sum(fundsIn) fundsIn
from mytable t
group by license, name, activityDate
order by row_number() over(partition by license order by activityDate desc) 

我希望第二种方法在大型数据集上效率较低。

请向我们展示示例数据和所需结果。到目前为止,有不止一种方式来解释你的问题。我认为你应该展示一些数据。但是如果不进行测试,我认为在
选择中使用
max
是不行的。您应该在
having
命令中的
groupby
之后添加
MAX(ActivityDate)
。您描述的顺序正确,但您的代码是错误的。您应该首先计算最大活动日期,然后将其(连同
名称
许可证
)返回到
表1
。您将只剩下最新的记录。然后你可以计算资金总额。请向我们展示样本数据和期望的结果。到目前为止,有不止一种方式来解释你的问题。我认为你应该展示一些数据。但是如果不进行测试,我认为在
选择中使用
max
是不行的。您应该在
having
命令中的
groupby
之后添加
MAX(ActivityDate)
。您描述的顺序正确,但您的代码是错误的。您应该首先计算最大活动日期,然后将其(连同
名称
许可证
)返回到
表1
。您将只剩下最新的记录。然后,您可以获取资金总额。这似乎只提取整个数据集中的最后一个活动日期,而不是每个许可证的最后一个活动日期。它现在已更新。max ActivityDate是每个许可证的当前最大活动日期这似乎只提取整个数据集中的最后一个活动日期,而不是每个许可证的最后一个活动日期。它现在已更新。现在每个许可证的最大活动日期似乎就是我要找的!非常感谢。我稍微修改了一下,以排除FundsIn=0的最后一个活动日期。它似乎在按预期工作。我添加的where子句会导致任何问题吗?现在运行良好。再次感谢从表t中选择许可证、名称、活动日期、金额(FundsIN)作为FundsIN,其中t.ActivityDate=(从表t1中选择max(t1.ActivityDate),其中t1.License=t.License和t1.FundsIN>0)按许可证、名称、活动日期顺序按活动日期描述、FundsIN描述、许可证“”’分组,这似乎就是我要找的!非常感谢。我稍微修改了一下,以排除FundsIn=0的最后一个活动日期。它似乎在按预期工作。我添加的where子句会导致任何问题吗?现在运行良好。再次感谢从表t中选择许可证、名称、ActivityDate、总和(FundsIN)作为FundsIN,其中t.ActivityDate=(从表t1中选择最大值(t1.ActivityDate),其中t1.License=t.License和t1.FundsIN>0)按许可证、名称、ActivityDate顺序按ActivityDate描述、FundsIN描述、许可证“”分组