求和一列,减去第二列

时间:2015-11-27 12:22:20

标签: sql-server tsql sql-server-2014

我想显示两列的减法。从第一列开始,我需要对所有值求和,并从第二列中减去每个值。

这是表结构:

reference.conf

公式应该去:

id | name | col1  | col2 | date
------------------------------------
432| xxx  | 0     | 15   |2015-11-17
432| yyy  | 10    | 30   |2015-11-19 
432| zzz  | 60    | 40   |2015-11-20  

433| aaa  | 0     | 60   |2015-11-17
433| bbb  | 80    | 20   |2015-11-19 
433| ccc  | 60    | 10   |2015-11-20  

结果是col3,输出应该像

一样
sum(col1) = 70  =>>>   WHERE ID = 432  

70 - col2            col3
-------------------------
=> 70 - 15         =  55
=> 70 - (30 + 15)  =  25 
=> 70 - (40 + 45)  = -15
---------------------------

sum(col1) = 140  ===>>    WHERE ID = 433  

 140 -   col2         col3
-------------------------
=> 140 -  60        =  80
=> 140 - (60 + 20)  =  60 
=> 140 - (10 + 80)  =  50

编辑:如果我需要的值会因组而异,如432和433 id列。

4 个答案:

答案 0 :(得分:6)

架构信息

DECLARE @TEST TABLE
  (
     id INT,
     name VARCHAR(10),
     col1       INT,
     col2        int
  ) 

INSERT INTO @TEST VALUES 
(432,'xxx',0, 15 ),
(432,'yyy',10, 30 ),
(432,'zzz',60, 40 ),
(433,'aaa',0, 60 ),
(433,'bbb',80, 20 ),
(433,'ccc',60, 10 )

<强>查询

    SELECT  T.id ,
        T.name ,
        T.col1 ,
        T.col2 ,
        SUM(T.col1) OVER( PARTITION BY T.id ORDER BY T.id ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
        - SUM(T.col2) OVER ( PARTITION BY T.id ORDER BY T.id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS col3
FROM    @TEST T;

<强>结果

id | name | col1  | col2 | col3 |
---------------------------------
432  | xxx  | 0     | 15   |  55  |
432  | yyy  | 10    | 30   |  25  |
432  | zzz  | 60    | 40   | -15  |
433  | aaa  | 0     | 60   |  80  | 
433  | bbb  | 80    | 20   |  60  | 
433  | ccc  | 60    | 10   |  50  | 

<强> SQL Fiddle

答案 1 :(得分:1)

您可以在SELECT字段列表中使用两个子查询。

首先,您将得到一个名为yourtable的表的所有行的总和,在第二行中,您将获得当前行之前的所有行的总和。所以你可以减去两个值。

试试这个:

SELECT T.id, T.name, T.col1, T.col2,
ISNULL(
    (SELECT SUM(T2.col1) FROM yourtable T2)
,0) - 
ISNULL(
    (SELECT SUM(T3.col2) FROM yourtable T3 
    WHERE T3.id <= T.id)
,0) as col3,
t.date
FROM yourtable T

继续Sql fiddle example

修改

SELECT T.id, T.name, T.col1, T.col2,
ISNULL(
    (SELECT SUM(T2.col1) FROM yourtable T2 where T2.id = T.id)
,0) - 
ISNULL(
    (SELECT SUM(T3.col2) FROM yourtable T3 
    WHERE T3.id = T.id AND T3.date <= T.date)
,0) as col3,
t.date
FROM yourtable T

继续Sql Fiddle edited example

注意:深度修改可能是一个不同的问题。两个查询是不同的

注意:带有重复值的名为ID的字段

答案 2 :(得分:1)

这应该有效:

declare @total int = (select sum(col1) from Table)
select id, name, col1, col2, @total - (select sum(col2) from Table where date <= T.date) as col3, date from Table T

我假设您希望每次前一次总计(基于日期)减去。我希望这没关系。

答案 3 :(得分:1)

您可以使用简单的选择查询和交叉申请

    SELECT ID
    ,NAME
    ,COL1
    ,COL2
    ,A.C1 - (
        SUM(COL2) OVER (
            ORDER BY ID
            )
        ) AS COL3
FROM TABLE1 T1
CROSS APPLY (
    SELECT SUM(COL1) AS C1
    FROM TABLE1 T2
    ) A