标签: running-totals

如何在大表的有序列中获取最后一个非空值?

我有以下输入:

 id | value 
----+-------
  1 |   136
  2 |  NULL
  3 |   650
  4 |  NULL
  5 |  NULL
  6 |  NULL
  7 |   954
  8 |  NULL
  9 |   104
 10 |  NULL
Run Code Online (Sandbox Code Playgroud)

我希望得到以下结果:

 id | value 
----+-------
  1 |   136
  2 |   136
  3 |   650
  4 |   650
  5 |   650
  6 |   650
  7 |   954
  8 |   954
  9 |   104
 10 |   104
Run Code Online (Sandbox Code Playgroud)

简单的解决方案是用<关系连接表,然后选择 a 中的MAXGROUP BY: …

null sql-server t-sql window-functions running-totals

14
推荐指数
3
解决办法
7268
查看次数

根据另一列重置运行总计

我正在尝试计算运行总数。但是当累计总和大于另一列值时它应该重置

create table #reset_runn_total
(
id int identity(1,1),
val int, 
reset_val int,
grp int
)

insert into #reset_runn_total
values 
(1,10,1),
(8,12,1),(6,14,1),(5,10,1),(6,13,1),(3,11,1),(9,8,1),(10,12,1)


SELECT Row_number()OVER(partition BY grp ORDER BY id)AS rn,*
INTO   #test
FROM   #reset_runn_total
Run Code Online (Sandbox Code Playgroud)

指数详情:

CREATE UNIQUE CLUSTERED INDEX ix_load_reset_runn_total
  ON #test(rn, grp) 
Run Code Online (Sandbox Code Playgroud)

样本数据

+----+-----+-----------+-----+
| id | val | reset_val | Grp |
+----+-----+-----------+-----+
|  1 |   1 |        10 | 1   |
|  2 |   8 |        12 | 1   |
|  3 |   6 |        14 | 1 …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql sql-server-2012 running-totals

10
推荐指数
1
解决办法
5421
查看次数

根据变更日志计算库存数量

假设您有以下表结构:

LogId | ProductId | FromPositionId | ToPositionId | Date                 | Quantity
-----------------------------------------------------------------------------------
1     | 123       | 0              | 10002        | 2018-01-01 08:10:22  | 5
2     | 123       | 0              | 10003        | 2018-01-03 15:15:10  | 9
3     | 123       | 10002          | 10004        | 2018-01-07 21:08:56  | 3
4     | 123       | 10004          | 0            | 2018-02-09 10:03:23  | 1
Run Code Online (Sandbox Code Playgroud)

FromPositionId并且ToPositionId是股票头寸。某些位置 ID:s 具有特殊含义,例如0。事件 from 或 to0表示库存已创建或删除。From0可能是交货的库存,to0可能是发货的订单。

该表目前包含大约 550 …

sql-server optimization sql-server-2014 running-totals

10
推荐指数
1
解决办法
1853
查看次数

是否可以在视图中进行此数学运算?

我的任务是为客户创建一个视图。具体来说,它必须在一个视图中。但是,我不确定如何在视图中进行一些数学运算。我不知道这是否可能。但话又说回来,我的心很虚弱。

我使用的是 SQL Server 2008R2,因此高级OVER()功能不起作用。

假设一个人有 400 美元可以花。他们可以花更多的钱,但前 400 美元是免费的。报告的一列将显示该人在某事上花费的金额,另一列将显示该人需要自掏腰包支付的总金额

因此,对于此人的报告中的第一条记录,一列将显示他们已花费的金额,例如 50 美元,然后第二列将显示 0 美元。在幕后,他们还有 350 美元可以花。

下一个记录是该人花费 300 美元。第二列仍将显示 0 美元,而在幕后,最初的 400 美元现在是 50 美元。

该人的第三项记录显示他们花了 75 美元,但他们从最初的 400 美元中只剩下 50 美元。第二列现在应该有 25 美元的价值。他们已经用尽了最初的 400 美元,现在正在花自己的钱。

第四条记录显示他们花了 40 美元,所以现在第二列将显示 65 美元。等等...

我已经简要阅读了 CTE 和表值函数等,但是是否可以将它们以任意组合使用以提供上述所需的行为?

以下是结构和所需结果的一些示例代码

CREATE TABLE Payroll (
    PersonID int,
    PlanCode varchar(10),
    Deduction int NULL
)
GO

INSERT INTO Payroll (PersonID, PlanCode, Deduction)
VALUES (1, 'Medical', 200)
  ,(1, 'Dental', 250)
  ,(1, …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql sql-server-2008-r2 view running-totals

7
推荐指数
3
解决办法
605
查看次数

根据先进先出 (FIFO) 计算数量

我正在尝试根据 FIFO 获取数量结果,下面有 2 个表:

表购买:

| PO    | Date         | Quantity | Item | 
|-------|--------------|----------|------|
| PO001 | 01-Jan-2016  | 3        | AO21 |  
| PO002 | 10-Jan-2016  | 7        | AO21 |  
| PO003 | 01-Feb-2016  | 3        | AO21 |  
Run Code Online (Sandbox Code Playgroud)

表库存:

| SO    | Date        | Quantity | Item |
|-------|-------------|----------|------|
| SO001 | 02-Jan-2016 | 2        | AO21 |
| SO002 | 11-Feb-2016 | 8        | AO21 |
| SO003 | 12-Feb-2016 | 6        | AO23 …
Run Code Online (Sandbox Code Playgroud)

mysql running-totals

6
推荐指数
1
解决办法
6099
查看次数

SQL中当前行数据减去前一行数据的总和

我想在 SSMS 中创建一个表或视图,它应该有一个名为qoh的列。在该列中应该计算列rel_qty 的总和值。IE

  1. qoh的第一个数据与rel_qty的第一行的值 相同
  2. qoh 的第二个值应该是rel_qty的第一行和第二行的值之
  3. qoh 的第三个值 应该是第一行、第二行和第三行的rel_qty值的总和

有没有可能做到这一点?

这是我的查询。但是这个查询只满足第一行和第二行,仅此而已,

SELECT  a.id, a.tot_qty, a.rel_qty, 
    (a.tot_qty - 
        COALESCE (a.rel_qty +
            (SELECT b.rel_qty
        FROM    dbo.foo AS b
        WHERE   (b.id = a.id - 1)), 
        a.rel_qty)
    ) AS qoh 
FROM    dbo.foo AS a
ORDER BY    a.id
Run Code Online (Sandbox Code Playgroud)

如果我的 id 跳过一个值,则此查询无法进行计算。我怎样才能解决这个问题?

这是我的结果截图

单击此处查看屏幕截图

sql-server sql-server-2014 running-totals

5
推荐指数
1
解决办法
2万
查看次数

累积总和的 SQL 查询

我在制定(相对)简单的 SQL 查询(使用 SQL Server 2012)时遇到问题。我们有一个数据库,可以为某些用户计算一些东西。因此,我们有一个非常简单的数据库结构,由两个表组成。

users

PK_User, uniqueidentifier
ID, bigint
Username, nvarchar(128)
CreationTimestamp, datetime
Run Code Online (Sandbox Code Playgroud)

data

PK_Data, uniqueidentifier
FK_User, uniqueidentifier
FK_Reporter, uniqueidentifier
CreationTimestamp, datetime
Run Code Online (Sandbox Code Playgroud)

我目前正在使用以下 SQL 语句:

SELECT u.Username, COUNT(d.FK_User) AS 'Count', CAST(FLOOR(CAST(d.CreationTimestamp AS float)) AS datetime) AS 'Date'
FROM data d INNER JOIN users u ON u.PK_User = d.FK_User
GROUP BY CAST(FLOOR(CAST(d.CreationTimestamp AS float)) AS datetime), u.Username
ORDER BY CAST(FLOOR(CAST(d.CreationTimestamp AS float)) AS datetime)
Run Code Online (Sandbox Code Playgroud)

它提供了这样的东西:

User1   5   %Date1%
User2   3   %Date1%
User1   7   %Date2%
User2 …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2012 sum running-totals

5
推荐指数
1
解决办法
9446
查看次数

在 SQL Server 中为滚动总和设置非负底限

我需要在滚动总和计算上设置一个下限。例如,与

PKID    NumValue    GroupID
----------------------------
1       -1          1
2       -2          1
3       5           1
4       -7          1
5       1           2
Run Code Online (Sandbox Code Playgroud)

我想拥有:

PKID   RollingSum    GroupID
----------------------------- ## Explanation: 
1      0             1        ## 0 - 1 < 0  => 0
2      0             1        ## 0 - 2 < 0  => 0
3      5             1        ## 0 + 5 > 0  => 5
4      0             1        ## 5 - 7 < 0  => 0
Run Code Online (Sandbox Code Playgroud)

当添加一个负数将导致总和为负时,将激活限制以将结果设置为零。后续的加法应该基于这个调整后的值,而不是原来的滚动总和。

应该使用加法来达到预期的结果。如果第四个数字从 -7 变为 -3,则第四个结果应该是 2 而不是 0

如果可以提供单个金额而不是几个滚动数字,那也是可以接受的。我可以使用存储过程来实现非负加法,但这太低级了。 …

sql-server-2008 sql-server running-totals

5
推荐指数
1
解决办法
1907
查看次数

值重置之间的累积持续时间

--DROP TABLE Taco_Val;
CREATE TABLE Taco_Val
(
    ID          INT IDENTITY(1,1),
    AuditID     VARCHAR(5),
    CreditID    VARCHAR(10),
    TS          DATETIME,
    Val         BIT
);

INSERT INTO Taco_Val
VALUES
 ('a1', 1, '2018-08-09 19:24:39.823',   1),--> Started 
 ('ac', 1, '2018-08-09 20:53:07.273',   0),
 ('as', 1, '2018-08-09 21:04:40.670',   0),
 ('a9', 1, '2018-08-09 21:14:17.660',   1),--> Another Seq
 ('av', 1, '2018-08-09 21:38:56.910',   1),
 ('ad', 1, '2018-08-09 21:48:46.180',   1),
 ('an', 1, '2018-08-09 22:00:15.650',   0),
 ('a4', 1, '2018-08-09 22:08:26.517',   1),-->Another Seq
 ('a8', 1, '2018-08-09 22:16:16.253',   0),
 ('a3', 1, '2018-08-09 22:16:24.247',   1),-->Another Seq
 ('ai', 1, …
Run Code Online (Sandbox Code Playgroud)

sql-server query sql-server-2012 running-totals

5
推荐指数
1
解决办法
452
查看次数

通过从初始总和中依次减去每行的金额来计算每行的余额

我会用一个例子来解释这个问题。

一个查询,将选择并显示我所做的提款流程并显示我的存款余额状态。

Deposit创建一个包含列TotalAmount, 的表DepositDate

另一个表Withdrawal是用列WithdrawAmount,来创建的WithdrawDate

所以我使用 SELECT 查询从带有公式的两个表中进行选择:

SELECT WithdrawAmount,
CASE WHEN ( TotalAmount - WithdrawAmount) = 0 THEN 'ZeroBalanceOops'
ELSE 'StillAvailableYAY' as 'Status'
FROM Deposit Inner Join Withdraw WHERE [WithdrawDate] between this month beginning and ending
Run Code Online (Sandbox Code Playgroud)

所以对于这个查询,假设我有 500 的存款,并且只会存款一次。如果我这个月只提现一次,然后把押金全部提现,效果会很好。结果将显示如下:

| WithdrawAmount | Status          |
| 500            | ZeroBalanceOops |
Run Code Online (Sandbox Code Playgroud)

但是,如果我在一个月内提款不止一次,并且这些提款将使余额 = 0,则它不起作用。假设存款再次为 500,结果将显示如下:

| WithdrawAmount  | Status            |
| 250             | StillAvailableYAY |
| 250             | StillAvailableYAY | …
Run Code Online (Sandbox Code Playgroud)

sql-server select sql-server-2014 running-totals

3
推荐指数
1
解决办法
8999
查看次数