我有以下输入:
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 中的MAX
值GROUP BY
: …
我正在尝试计算运行总数。但是当累计总和大于另一列值时它应该重置
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) 假设您有以下表结构:
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 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) 我正在尝试根据 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) 我想在 SSMS 中创建一个表或视图,它应该有一个名为qoh的列。在该列中应该计算列rel_qty 的总和值。IE
有没有可能做到这一点?
这是我的查询。但是这个查询只满足第一行和第二行,仅此而已,
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 查询(使用 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) 我需要在滚动总和计算上设置一个下限。例如,与
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
如果可以提供单个金额而不是几个滚动数字,那也是可以接受的。我可以使用存储过程来实现非负加法,但这太低级了。 …
--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) 我会用一个例子来解释这个问题。
一个查询,将选择并显示我所做的提款流程并显示我的存款余额状态。
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) running-totals ×10
sql-server ×9
t-sql ×3
mysql ×1
null ×1
optimization ×1
query ×1
select ×1
sum ×1
view ×1