Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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
Sql server SQL递归查询-秩较小的行和_Sql Server_Rank - Fatal编程技术网

Sql server SQL递归查询-秩较小的行和

Sql server SQL递归查询-秩较小的行和,sql-server,rank,Sql Server,Rank,使用MS SQL-2012 我正在尝试运行一个SQL查询,该查询按产品id对行进行排序。然后计算一个总和,该总和表示排序小于或等于它的行。 我建立了一个公式来做到这一点,它的工作,但速度慢,资源昂贵 我的直觉是有一个CTE或秩函数可以做我想做的-我只是不知道 如果一个产品有4行,那么使用秩I可以重新计算较小行数量的总和 Product Order Qty Rank Sum Apple John 5 1 5 Apple Josh

使用MS SQL-2012 我正在尝试运行一个SQL查询,该查询按产品id对行进行排序。然后计算一个总和,该总和表示排序小于或等于它的行。 我建立了一个公式来做到这一点,它的工作,但速度慢,资源昂贵

我的直觉是有一个CTE或秩函数可以做我想做的-我只是不知道

如果一个产品有4行,那么使用秩I可以重新计算较小行数量的总和

Product   Order     Qty Rank    Sum  
Apple     John      5   1       5  
Apple     Josh      2   2       7  
Apple     Jacob     1   3       8  
Apple     Jennifer  1   4       9  
第1行总和等于第1行数量 第2行总和等于第1行数量、第2行数量 第3行总和等于第1行数量、第2行数量、第3行数量 第4行总和等于第1行数量、第2行数量、第3行数量、第4行数量

在此方面的任何帮助都将不胜感激

提前谢谢。 Josh适用于Sql Server 2012+:

Sql Server 2008-:


如果我理解正确,我认为你想要这个。这也提供了示例代码,如果第一个假设是错误的,请评论

create table #apples
(product varchar(20)
,orders varchar(20)
,qty int
)

insert into #apples
values ('apple','john',1)
,('apple','john',1)
,('apple','john',1)
,('apple','john',1)
,('apple','john',1)
,('apple','josh',1)
,('apple','josh',1)
,('apple','jacob',1)
,('apple','jennifer',1)
Go

With Tots as 
(Select product,orders,sum(qty) 'Sums', RANK() OVER (partition by product ORDER BY SUM(QTY) desc,orders) 'rnk'
 from #apples
 group by product,orders)

select t1.rnk, SUM(t2.Sums)
from tots t1
    inner join Tots t2
    on t1.rnk >= t2.rnk
    group by t1.rnk

你的问题很难理解。请你把它格式化好一点。谢谢。什么版本的SQL Server?并向我们展示您已有的查询。与子查询相比,直接连接p2更有效。因此:从产品p1中选择p1.products、p1.order、p1.qty、p1.rank、sump2.qty在p1.product=p2.product和p2.rank上加入产品p2谢谢-我知道有一个通用的表表达式可以工作。就是无法拨入。
select *, (select sum(qty) from products p2
           where p1.product = p2.product and p2.rank <= p1.rank) as [sum]
from products p1
create table #apples
(product varchar(20)
,orders varchar(20)
,qty int
)

insert into #apples
values ('apple','john',1)
,('apple','john',1)
,('apple','john',1)
,('apple','john',1)
,('apple','john',1)
,('apple','josh',1)
,('apple','josh',1)
,('apple','jacob',1)
,('apple','jennifer',1)
Go

With Tots as 
(Select product,orders,sum(qty) 'Sums', RANK() OVER (partition by product ORDER BY SUM(QTY) desc,orders) 'rnk'
 from #apples
 group by product,orders)

select t1.rnk, SUM(t2.Sums)
from tots t1
    inner join Tots t2
    on t1.rnk >= t2.rnk
    group by t1.rnk