计算新列中的值

时间:2017-12-12 07:32:03

标签: sql-server sql-server-2008 stored-procedures

以下是我的示例表数据。有一个订单号,表按ITEM列排序。每次BREAKOUT为True时,BREAK_M列只是一个运行计数。您可以看到BREAK_MCT的其他行显示为NULL。我想要一个像LIKETHIS列这样的查询,其中BREAK_M重复自身直到下一个值开始并重复自身。

ORDERNO      BREAKOUT  ITEM_ID   BREAK_M    LIKETHIS

2411       True       9290       1              1

2411       False      9291      NULL           1

2411       False      9292      NULL           1

2411       False      9293      NULL           1    

2411       True       9300      2              2

2411      False      9301      NULL           2

2411       False      9302     NULL           2

2411       False      9303     NULL           2

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

您可以尝试此查询以获得所需的结果。

SELECT ORDERNO, BREAKOUT, ITEM_ID, BREAK_M, 
    (SELECT MAX(BREAK_M)
            FROM SampleTable 
            WHERE ITEM_ID <= ST.ITEM_ID 
    ) AS LIKETHIS
FROM SampleTable AS ST

答案 1 :(得分:0)

我确信有更好的方法可以做到这一点,但是这样的事情应该有效

select *, 
    (Select top 1 BREAK_M  -- OR COUNT, WHATEVER THE REAL COLUMN NAME IS
            from BREAK4 
            where Item_ID <= T.Item_ID 
                and BREAK_OUT = 1
            order by item_ID desc
    ) as LIKETHIS
from BREAK4 T
ORDER BY ITEM_ID
编辑:在评论中看小提琴后

试试这个http://sqlfiddle.com/#!6/8974b/25。问题是

(1)你的小提琴与你上面的问题没有相同的列,我不得不将Break_M改为Count。 (2)你在小提琴中的空值不是真正的空值,它们是一个字符串,表示'NULL',这不是同一个东西。取决于您的真实数据库对于实际空值可能需要(非空)或“&lt;&gt;如果不是,则为“NULL”。最好忽略此列并使用Breakout = 1(true),就像这样

[ngClass]="{active: (searching === search.searchKey)}"

答案 2 :(得分:0)

试试这个,

create table #t(ORDERNO int,BREAKOUT varchar(10),ITEM_ID int,BREAK_M int, LIKETHIS int)
insert into #t VALUES
(2411,'True',9290,  1     ,null)
,(2411,'False',9291, NULL  ,null)
,(2411,'False',9292, NULL  ,null)
,(2411,'False',9293, NULL  ,null)   
,(2411,'True',9300, 2     ,null)
,(2411,'False',9301, NULL  ,null)
,(2411,'False',9302,NULL   ,null)
,(2411,'False',9303,NULL   ,null)

select ORDERNO ,BREAKOUT ,ITEM_ID ,t.BREAK_M 
, ca.BREAK_M LIKETHIS  from #t t

outer apply(select top 1 t1.BREAK_M 
from #t t1 where t1.ITEM_ID<=t.ITEM_ID and  t1.BREAK_M is not NULL
 order by t1.ITEM_ID desc )ca

drop table #t