SQL - 根据id添加列值

时间:2015-02-24 21:15:11

标签: sql sql-server

我有一张包含百万条记录的表格。以下是一组数据的示例:

select id, 
       id_depend, 
       Item, 
       values as 'Current Values' 
from mytable 
where id in (685690, 691282, 691297) 
order by 1

enter image description here

第一个id(685690)对应于第一个移动,第二个id(691282)取消第一个移动,第三个id是第一个移动的校正。 id_depend 字段将动作与原始动作相关联。

我需要显示相同的数据,添加一个新列,其中包含最后一个相关运动的值。我的意思是,有时第一个动作(其他ids)是严格的,并且在这个动作之后没有更正(例如:id 691371)。

enter image description here

1 个答案:

答案 0 :(得分:1)

如果我理解正确的话,这会有所帮助:

SELECT m.id,m.id_depend,m.Item,m.[values] [Current Values]
    ,CASE WHEN m.id_depend = 0 AND NOT EXISTS(SELECT 1 FROM mytable cor WHERE cor.id_depend = m.id)
        THEN m.[values] 
        ELSE COALESCE((SELECT SUM(mt.[values]) FROM mytable mt WHERE mt.Item = m.Item AND mt.id < m.id)+m.[values],0) 
     END [Values Required]
FROM mytable m

还有我的查询:

CREATE TABLE #mytable (id BIGINT, id_depend BIGINT, Item VARCHAR(50), [values] DECIMAL(23,10))

INSERT INTO #mytable (id,id_depend,Item,[values])VALUES(685690,0,'1',216),(685690,0,'2',108)
    ,(691282,685690,'1',-216),(691282,685690,'2',-108)
    ,(691297,685690,'1',324),(691297,685690,'2',162)
    ,(691371,0,'1',100),(691371,0,'2',200),(691371,0,'3',300)

SELECT m.id,m.id_depend,m.Item,m.[values] [Current Values]
FROM #mytable m

SELECT m.id,m.id_depend,m.Item,m.[values] [Current Values]
    ,CASE WHEN m.id_depend = 0 AND NOT EXISTS(SELECT 1 FROM #mytable cor WHERE cor.id_depend = m.id)
        THEN m.[values] 
        ELSE COALESCE((SELECT SUM(mt.[values]) FROM #mytable mt WHERE mt.Item = m.Item AND mt.id < m.id)+m.[values],0) 
     END [Values Required]
FROM #mytable m

DROP TABLE #mytable

如果您有任何疑问,请与我们联系。