[英]How to subtract previous value in a column with calculation of other column on SQL server
[英]SQL Server : show a new column that does calculation base on other rows
我正在使用SQL Server,我有一个表,将其简化如下:
item ----- order-----Active
-------------------------------
a-------------1---------true
b-------------2---------false
c-------------3---------true
d-------------4---------true
e-------------5---------false
f-------------6---------true
我想查询返回的三列和一个额外的列,称为new-order,对于每个项目,它为订单号低于其自身的每个非活动(活动为假)项目减去一个。 因此上表将变为
item ----- ordering-----Active----------NewOrder
-------------------------------------------------
a-------------1---------true----------1
b-------------2---------false----------2
c-------------3---------true----------2
d-------------4---------true----------3
e-------------5---------false----------4
f-------------6---------true----------4
我的尝试:
Select
g.item, g.ordering, g.active,
g.ordering - (Select Count(x.ordering)
from grocery As x
where x.ordering < g.ordering
and x.active = false
group by x.ordering) As NewOrder
From
grocery as g
这不起作用,因为子查询包含多个行。 但老实说,我不知道如何解决这个问题。 仅使用子查询是否有可能?
感谢任何建议或帮助
编辑:
在数据库中,有超过6行,并且没有正确的顺序。 基本上,商品的新订单是其自己的订单号#减去其订单号低于该商品的订单号的无效商品的数量。 同样,非活动项目是活动= false的项目。
我认为以下查询将为您提供所需的结果,您可以省略NULL
值。 当active
为true
时,您基本上需要NEWORDER
,因此可以将NULL
值省略为false
select
a.*,
b.NEWORDER
from
(
select
*
from
test1
)
as a
left join
(
select [order] as NO,ROW_NUMBER() over(order by [order]) as NEWORDER from test1 where active='true'
)
as b
on a.[order]=b.no
输出值
item order active NEWORDER
-------------------------------------
a 1 true 1
b 2 false NULL
c 3 true 2
d 4 true 3
e 5 false NULL
f 6 true 4
这是一种方法
SELECT item,
[order],
active,
NewOrder = Sum(t)OVER(ORDER BY [order])
FROM (SELECT *,
CASE WHEN Lag(Active)OVER(ORDER BY [order]) = 'false' THEN 0 ELSE 1 END AS t
FROM (VALUES ('a',1,'true' ),
('b',2,'false' ),
('c',3,'true' ),
('d',4,'true' ),
('e',5,'false' ),
('f',6,'true' )) tc (item, [order], Active)) a
结果:
+------+-------+--------+----------+
| item | order | active | NewOrder |
+------+-------+--------+----------+
| a | 1 | true | 1 |
| b | 2 | false | 2 |
| c | 3 | true | 2 |
| d | 4 | true | 3 |
| e | 5 | false | 4 |
| f | 6 | true | 4 |
+------+-------+--------+----------+
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.