繁体   English   中英

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值。 activetrue时,您基本上需要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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM