2015-11-27 123 views
3

我想要显示两列的相减。从第一列我需要得到总和的所有价值和减去第二列的每个价值。总和一列并减去第二列

这是表结构:

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 

公式应该去:

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 

结果是COL3和输出应该是这样的

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

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

编辑:什么如果我需要的数值有所不同将该组视为432和433 ID列。

回答

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,'kkk',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

+0

我有编辑问题 – Dejan

+0

@ sqlProfile87:那么你必须使用分区的子句为我的查询。等待我将在几分钟内更新我的答案 –

+0

@ sqlProfile87:我已经更新了我的答案。检查sql小提琴链接的结果 –

1

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

第一次你会得到一个名为yourtable的表的所有行的总和,第二次你会得到当前所有行的总和。所以你可以减去两个值。在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 

转到

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 edited example

讲究:

试试这个深度编辑可能是一个不同的问题。这两个查询是型动物

关注:它与重复的值

+0

我有编辑的问题 – Dejan

1

没有好的名为ID字段这应该工作:

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 

我是假设你想每次以前总。减去(根据日期)。我希望这是好的。

+0

没有,因为每列@total必须更新 –

+0

Aahhh,你是对的。我会尽力更新我的答案... – SmartDev

+0

我刚刚更新了它! – SmartDev

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 
+0

我有编辑问题 – Dejan

相关问题