【问题标题】:How to decreasing value based on other column in SQL如何根据 SQL 中的其他列减少值
【发布时间】:2016-04-03 06:23:38
【问题描述】:

我有下表:

ID_Client | Counter | Length | Amount | Date_From | Date_To
-------------------------------------------------------------
AAA         0         25       30      2015-01-09   2015-01-15
AAA         2         25       30      2015-01-15   2015-02-06  
AAA         2         25       30      2015-02-06   2015-03-10
AAA         1         25       30      2015-03-10   2015-04-12 
AAA         1         25       30
AAA         2         25       30
AAA         1         25       30
AAA         1         25       30
AAA         1         25       30
AAA         2         25       30      2016-04-01   9999-99-99 Infinity (last record for AAA at the moment)
BBB         0         30       60
BBB         1         30       60
BBB         2         30       60
BBB         2         30       60

Value1 列:

Value1 的第 1 行 = Counter 的第 1 行

Value1 的第 2 行 = Value1 的第 1 行 + Counter 列的第 2 行等。

Value2 列:

Value2 的第 1 行 = 金额的第 1 行

Value2 的第 2 行 = Value2 的第 1 行 - Counter 列的第 2 行等

结果应按 ID_Client 分组。 Value1 和 Value 2 应该在新客户时重新开始计数。

我需要这张桌子:

ID_Client | Counter | Length | Amount | Value1 | Value2
--------------------------------------------------------
AAA         0         25       30       0        30
AAA         2         25       30       2        28
AAA         2         25       30       4        26
AAA         1         25       30       5        25
AAA         1         25       30       6        24
AAA         2         25       30       8        22
AAA         1         25       30       9        21
AAA         1         25       30       10       20
AAA         1         25       30       11       19
AAA         2         25       30       13       17
BBB         0         30       60       0        60
BBB         1         30       60       1        59 
BBB         2         30       60       3        57
BBB         2         30       60       5        55

谢谢

【问题讨论】:

  • 是什么决定了这些的顺序?顺序不重要吗?或者这张桌子的PK是多少?
  • 如何定义第一行?
  • 看起来像一个非常糟糕的数据库设计。那么ID的所有记录必须具有相同的长度和数量?应该有一个客户端表,每个客户端 ID 只包含一个包含这两个值的记录。
  • @PM77-1:在每组客户端的开头第一行有 null 但我使用 ISNULL 更改为 0
  • @user2988195:所以第一行是计数器为 NULL 或 0 的行。好的。但哪个是第二个,哪个是第三个?没有列来指示记录的顺序(如日期时间等)。

标签: sql sql-server tsql


【解决方案1】:

SQL Fiddle

我分配行号,因为我需要一个唯一的值来排序,然后我们只需将 value1 相加,然后或多或少地从 value1 中减去金额..

这使用一个公用表表达式来创建一个带有行号的结果集,然后使用一个分析函数(窗口集)来生成一个“运行”总计。

with cte as (
  Select ID_CLIent, Counter, Length, Amount, row_number()  
  over (partition by ID_CLient order by counter) RN
from foo)

Select ID_Client
     , Counter
     , Length
     , Amount
     , sum(Counter) over (Partition by ID_CLIENT order by ID_Client, RN) as Value1
     , Amount - sum(Counter) over (Partition by ID_CLIENT order by ID_Client, RN) as Value2 
  from cte c
  order by ID_Client

现在我们有了可以排序的日期,我不再需要行号了...

Select ID_Client
     , Counter
     , Length, Amount
     , sum(Counter) over (Partition by ID_CLIENT order by ID_Client, Date_from) as Value1
     , Amount - sum(Counter) over (Partition by ID_CLIENT order by ID_Client, Date_From) as Value2
     , Date_from
     , Date_To
  from TableName 
  order by ID_Client, Date_From, Date_To

【讨论】:

  • 现在我们有了一个日期......你可以去掉 Row Num 并替换 Date_From 以及 Common table 表达式
  • 干得好! :) 谢谢!
猜你喜欢
  • 2018-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-10
  • 2020-06-01
  • 1970-01-01
  • 2021-11-12
  • 2019-10-01
相关资源
最近更新 更多