gpt4 book ai didi

sql - 查询以显示交易表中的已用积分

转载 作者:行者123 更新时间:2023-12-04 11:38:33 28 4
gpt4 key购买 nike

我正在使用一个表,其中包含信贷交易,我想在其中显示销售时花费了谁的信贷。

在表中:


实体使用唯一的实体代码添加Credits(记录在GivenByUserCode列中)
信用额添加始终具有这样的代码。
花费的信用额始终为负值。
花费的积分将没有实体代码(GivenByUserCode的值为null)。


以上述数据为例,如果用户在2018-01-02上购物,则报告应显示所有这些源自BM01的信用。添加的复杂性在于,可以将购买分为多个添加,请参见2018-02-03上的购买,将其分为三个添加。

我认为解决方案与使用cteover有关,但是我没有使用这些经验。我确实在SqlServerCentral上发现了类似(不同)的问题。

任何帮助/方向将不胜感激。



输入和DDL

DECLARE @CreditLogs TABLE(CreditLogId int not null identity(1,1), Credits INT NOT NULL, OccurredOn DATETIME2(7) NOT NULL, GivenByUserCode VARCHAR(100) NULL)

INSERT INTO @CreditLogs (Credits, OccurredOn, GivenByUserCode) VALUES
(10, '2018-01-01', 'BM01')
, (10, '2018-01-01', 'BM01')
, (-10, '2018-01-02', NULL)
, (-5, '2018-01-04', NULL)
, (5, '2018-02-01', 'SP99')
, (40, '2018-02-02', 'BM02')
, (-40, '2018-02-03', NULL)
, (-4, '2018-03-05', NULL)


以表格形式输入

CreditLogId | Credits | OccurredOn | GivenByUserCode
------------+---------+------------+----------------
1 | 10 | 2018-01-01 | BM01
2 | 10 | 2018-01-01 | BM01
3 | -10 | 2018-01-02 | NULL
4 | -5 | 2018-01-04 | NULL
5 | 5 | 2018-02-01 | SP99
6 | 40 | 2018-02-02 | BM02
7 | -40 | 2018-02-03 | NULL
8 | -4 | 2018-03-05 | NULL


预期产量

SELECT *
FROM (VALUES
(3, '2018-01-02', 10, 'BM01')
,(4, '2018-01-04', 5, 'BM01')
,(7, '2018-02-03', 5, 'BM01')
,(7, '2018-02-03', 5, 'SP99')
,(7, '2018-02-03', 30, 'BM02')
,(8, '2018-03-05', 4, 'BM02')
) expectedOut (CreditLogId, OccurredOn, Credits, GivenByUserCode)


产生输出

CreditLogId | Occurred on | Credits | GivenByUserCode
------------+-------------+---------+----------------
3 | 2018-01-02 | 10 | BM01
4 | 2018-01-04 | 5 | BM01
7 | 2018-02-03 | 5 | BM01
7 | 2018-02-03 | 5 | SP99
7 | 2018-02-03 | 30 | BM02
8 | 2018-03-05 | 4 | BM02


到目前为止的代码

数量不多,我不确定从这里去哪里。

WITH totals AS (
SELECT CreditLogId, OccurredOn, credits, sum(credits) OVER(ORDER BY OccurredOn) AS TotalSpent
FROM @CreditLogs
WHERE Credits < 0
)
SELECT *
FROM totals




附加说明

预期输出是这些信用额度来自的每个已花费的信用额度。贷项以先进先出(FIFO)的基础花费。在此,对示例输出中的每个值进行说明,以期阐明所需的输出。


对于10个信用额度的消费(信用记录ID 3),可以追溯到信用记录ID 1的增加值
对于5个信用额度的消费(信用记录ID 4),可以追溯到信用记录ID 2(由于信用记录ID 1被“用完”)而增加。
对于信用记录ID为7的40个信用额度的支出,可以追溯到


信用记录ID 2、5学分中的剩余余额
信用记录ID 5(加5)
信用记录ID 6(又加上了40个,所以还剩下10个)

对于在信用记录8中花费4信用,将使用信用记录ID 6的余额


请注意,总余额仍为6个学分,余额不必为零,但永远不会为负数,因为用户只能花光自己的钱。

最佳答案

试试这个:

WITH Credits_added AS (
SELECT CreditLogId, OccurredOn, credits
, SUM(credits) OVER (ORDER BY CreditLogId) - credits AS b --before
, SUM(credits) OVER (ORDER BY CreditLogId) AS a --after
, GivenByUserCode
FROM @CreditLogs
WHERE Credits > 0)
, Credits_spent AS (
SELECT CreditLogId, OccurredOn, credits
, SUM(credits) OVER (ORDER BY CreditLogId) * -1 + credits AS b
, SUM(credits) OVER (ORDER BY CreditLogId) * -1 AS a
FROM @CreditLogs
WHERE Credits < 0)
SELECT s.CreditLogId, s.OccurredOn
, CASE WHEN a.a > s.a THEN s.a ELSE a.a END - CASE WHEN a.b > s.b THEN a.b ELSE s.b END AS Credits
, a.GivenByUserCode
FROM Credits_added AS a
INNER JOIN Credits_spent AS s ON a.a > s.b AND s.a > a.b

关于sql - 查询以显示交易表中的已用积分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50008226/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com