当前位置: 首页 > 面试题库 >

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

杜成和
2023-03-14
问题内容

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

在表中:

  • Credits由实体使用唯一的实体代码添加(记录在列中GivenByUserCode
  • 信用额添加始终具有这样的代码。
  • 花费的信用额始终为负值。
  • 那些花学分会不会有一个实体的代码(价值GivenByUserCodeIS null)。

以上述数据为例,如果用户2018-01-02在报表上进行了购买,则应显示所有源自的信用BM01。加法的复杂性在于,一个购买可以分为多个加法,请参见将购买2018-02-03分为三个加法。

我认为该解决方案与使用cte及以上有关,但我没有使用这些经验。我确实在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


 类似资料:
  • 说明 统一收单线下交易查询SDK。 官方文档:https://docs.open.alipay.com/api_1/alipay.trade.query/ 类 请求参数类 请求参数 类名:\Yurun\PaySDK\AlipayApp\Params\Query\Request 属性 名称 类型 说明 $method string 接口名称 $app_auth_token string 详见:htt

  • 说明 统一收单交易退款查询接口SDK。 官方文档:https://docs.open.alipay.com/api_1/alipay.trade.fastpay.refund.query/ 类 请求参数类 请求参数 类名:\Yurun\PaySDK\AlipayApp\Params\RefundQuery\Request 属性 名称 类型 说明 $method string 接口名称 $app_a

  • 问题内容: 我没有提交就做了一些查询。然后应用程序被停止。 如何显示这些未清交易并提交或取消交易? 问题答案: 如何显示这些未清交易并提交或取消交易? 没有打开的事务,MySQL将在断开连接时回滚该事务。 您无法提交交易(IFAIK)。 您使用显示线程 参见:http : //dev.mysql.com/doc/refman/5.1/en/thread- information.html 这将无济

  • 描述 贷款发放后,平台方按照合同号和贷款账号查询贷款的交易流水(包括发放、还款等金融交易),默认查询最近90天的交易,最多返回10条。 API代码 loan_app:trxn:query 请求参数 名称 类型 是否必须 描述 示例值 contractNo String 是 合同编号 acctNo String 是 账号 82700156225596267 dtStart Date 否 起始日期 2

  • 说明 用于会员进行积分增加、扣减交易 请求地址 http://api.dc78.cn/Api/mb_pttrans 请求方式 GET 请求参数 参数 参数名称 必填 描述 范例 mbno 卡号 输入或扫码 pt 积分 正数增加,负数扣减 subject 摘要 ref 关联业务单号 可选 op 操作员 memo 备注 返回 { "status":"1", "info":"积分更新成功", "id":

  • 用于会员进行积分增加、扣减交易 请求参数说明 参数 描述 必填 示例值 类型 最大长度 action 接口参数组 是 object └action 需要调用的接口名称 是 mb_pttrans string get GET参数组,本组参数需要参与签名 是 object └mbno 会员卡号 否 15696132602 number └pt 交易积分(正数增加,负数扣减) 否 1 number └s