【问题标题】:Differentiate full refund vs partial refund区分全额退款与部分退款
【发布时间】:2023-03-28 01:00:01
【问题描述】:

我想区分全额退款和部分退款。 SQL 数据库中没有标志,因此这个请求。关于数据的解释很少。可能会全额退款或部分退款给客户。全额退款是客户支付的全额退款,部分退款是部分退款。

我有 2 个表,订单表头和订单行(表头表有 CustomerId、OrderId、OrderDate、OrderGuid、OrderType、Amount、Reasoncode) (行表有 CustomerId、OrderId、OrderDate、OrderGuid、ItemNo、Quantity、LineAmount)。

当客户订购时,它会在标题级别如下所示:

 OrderId   OrderDate   CustomerID   OrderGuid    OrderType  Amount   ReasonCode
  FN1        2018-07-15    1          FN1-1        Sales       50       

  FN2        2018-07-16    2          FN2-1        Sales       100  

行级相同:

  OrderId   OrderDate   CustomerID  OrderGuid    ItemNo  LineAmount  Qty
   FN1        2018-07-15    1          FN1-1      123-0     20         1
   FN1        2018-07-15    1          FN1-1      111-0     30         1

   FN2        2018-07-16    2          FN2-1      586-0     40         1
   FN2        2018-07-16    2          FN2-1      482-1     20         1
   FN2        2018-07-16    2          FN2-1      784-1     20         1
   FN2        2018-07-16    2          FN2-1      624-0     20         1

退款时标头级别:

OrderId   OrderDate    CustomerID   OrderGuid      OrderType   Amount   ReasonCode
 FN1        2018-07-20    1          FN1-RF1        Credit       50      Lost_in_post 

 FN2        2018-07-21    2          FN2-RF1        Credit       60      Damaged_in_transit

行级相同:

 OrderId   OrderDate    CustomerID  OrderGuid    ItemNo  LineAmount  Qty
 FN1        2018-07-20    1          FN1-RF1    123-0     20         1
 FN1        2018-07-20    1          FN1-RF1    111-0     30         1

 FN2        2018-07-21    2          FN2-RF1    482-1     20         1
 FN2        2018-07-21    2          FN2-RF1    784-1     20         1
 FN2        2018-07-21    2          FN2-RF1    624-0     20         1

注意:没有 RefundDate 列,但它仍然是 OrderDate,日期为退款日期。

预期结果:我希望在两个不同的表中看到它们 全额退款:

 OrderNo      ItemNo    Qty 
 FN1_RF1      123-0       1
 FN1-RF1      111-0       1

部分退款:

 OrderNo   ItemNo     Qty
FN2-RF1   482-1       1
FN2-RF1   784-1       1
FN2-RF1   624-0       1

希望这是有道理的。 如果您有任何问题,请问我。先感谢您。 最好的

【问题讨论】:

  • 如果您将部分退款视为“订单的一部分已退款”,您为什么要将这些项目放在一个表中?这些物品已全额退款(每件 20 美元,20 美元)。
  • @Eli 原始订单有 4 件商品,但退款是 3 件商品因此部分退款。
  • 我知道,如果您从整体上查看订单,“全额退款”与“部分退款”应该在订单级别,而不是在订单项目级别。还有一点,将退款项目存储在单独的表中的目的是什么?
  • 您还必须考虑部分线路的退款。如果您在一行上发送了 10 个482-1 物品,但有两个有缺陷并退回了退款,您如何在您的数据库中表示它。当前的结构假定每件商品只有一行,或者全有或全无退货。
  • 也就是说,对于您当前的数据集,(已发货的行)和(已退款的行)之间的简单差异可以识别全部或部分退款。如果退款的行数 = 已发货的行数,则为全额退款,否则为部分退款。

标签: sql sql-server


【解决方案1】:

以下是通过示例解决方案重现您的问题, 但是一个快速的问题,为什么 FN2-RF1 被认为是部分退款?因为在您的示例中,总行项目 = 贷记金额。

http://rextester.com/EODK86280

【讨论】:

    【解决方案2】:

    这应该做你想做的事。您可以在 SSMS 中运行以下示例。

    首先,创建您提供的用于测试的数据。

    创建[header]表并插入数据:

    DECLARE @header TABLE ( OrderID VARCHAR(10), OrderDate DATETIME, CustomerID INT, OrderGuid VARCHAR(10), OrderType VARCHAR(10), Amount DECIMAL(18,2), ReasonCode VARCHAR(50) );
    INSERT INTO @header (
        OrderID, OrderDate, CustomerID, OrderGuid, OrderType, Amount, ReasonCode
    ) VALUES
    ( 'FN1', '2018-07-15', 1, 'FN1-1', 'Sales', 50, NULL )
    , ( 'FN2', '2018-07-16', 2, 'FN2-1', 'Sales', 100, NULL )
    , ( 'FN1', '2018-07-15', 1, 'FN1-RF1', 'Credit', 50, 'Lost_in_post' )
    , ( 'FN2', '2018-07-16', 2, 'FN2-RF1', 'Credit', 60, 'Damaged_in_transit' );
    

    创建[line]表并插入数据:

    DECLARE @line TABLE ( OrderID VARCHAR(10), OrderDate DATETIME, CustomerID INT, OrderGuid VARCHAR(10), ItemNo VARCHAR(10), LineAmount DECIMAL(18,2), Qty INT );
    INSERT INTO @line (
        OrderID, OrderDate, CustomerID, OrderGuid, ItemNo, LineAmount, Qty
    ) VALUES
    ( 'FN1', '2018-07-15', 1, 'FN1-1', '123-0', 20, 1 )
    , ( 'FN1', '2018-07-15', 1, 'FN1-1', '111-0', 30, 1 )
    , ( 'FN1', '2018-07-20', 1, 'FN1-RF1', '123-0', 20, 1 )
    , ( 'FN1', '2018-07-20', 1, 'FN1-RF1', '111-0', 30, 1 )
    , ( 'FN2', '2018-07-12', 2, 'FN2-1', '586-0', 40, 1 )
    , ( 'FN2', '2018-07-12', 2, 'FN2-1', '482-0', 20, 1 )
    , ( 'FN2', '2018-07-12', 2, 'FN2-1', '784-0', 20, 1 )
    , ( 'FN2', '2018-07-12', 2, 'FN2-1', '624-0', 20, 1 )
    , ( 'FN2', '2018-07-21', 2, 'FN2-RF1', '482-0', 20, 1 )
    , ( 'FN2', '2018-07-21', 2, 'FN2-RF1', '784-0', 20, 1 )
    , ( 'FN2', '2018-07-21', 2, 'FN2-RF1', '624-0', 20, 1 );
    

    然后我们可以查询它。

    全额退款

    SELECT
        ref.OrderGuid, line.ItemNo, line.Qty
    FROM @header ref
    INNER JOIN @header sale
        ON ref.OrderID = sale.OrderID
        AND sale.OrderType = 'Sales'
    INNER JOIN @line line
        ON ref.OrderGuid = line.OrderGuid
    WHERE
        ref.OrderType = 'Credit'
        AND ref.Amount = sale.Amount
    ORDER BY
        ref.OrderID;
    

    返回

    +-----------+--------+-----+
    | OrderGuid | ItemNo | Qty |
    +-----------+--------+-----+
    | FN1-RF1   | 123-0  |   1 |
    | FN1-RF1   | 111-0  |   1 |
    +-----------+--------+-----+
    

    部分退款

    SELECT
        ref.OrderGuid, line.ItemNo, line.Qty
    FROM @header ref
    INNER JOIN @header sale
        ON ref.OrderID = sale.OrderID
        AND sale.OrderType = 'Sales'
    INNER JOIN @line line
        ON ref.OrderGuid = line.OrderGuid
    WHERE
        ref.OrderType = 'Credit'
        AND ref.Amount < sale.Amount
    ORDER BY
        ref.OrderID;
    

    返回

    +-----------+--------+-----+
    | OrderGuid | ItemNo | Qty |
    +-----------+--------+-----+
    | FN2-RF1   | 482-0  |   1 |
    | FN2-RF1   | 784-0  |   1 |
    | FN2-RF1   | 624-0  |   1 |
    +-----------+--------+-----+
    

    查看 ref.Amountsale.Amount 比较,了解其工作原理。

    【讨论】:

    • 嗨@Critical错误,我已经尝试使用你的代码,它工作正常,直到在where子句之后它没有给出任何输出只是列名。我已经检查了两次字段值'Credit',是的,它可用。 ON ref.OrderGuid = line.OrderGuid
    • 我已经在数据库上复制了这段代码并执行了。但是当我们声明值但不在数据库中时,您的代码可以正常工作。
    • @StevePat,不幸的是,我不知道您的物理数据库是什么样的——我已尽力复制您的样本。如果您愿意,我们可以在聊天中继续此对话,也许我可以进一步帮助您。
    • 谢谢,可以加入聊天吗??
    • 因为我是新来的,我想我在这里没有 20 声望来加入聊天。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-16
    • 1970-01-01
    • 2018-03-28
    • 1970-01-01
    • 1970-01-01
    • 2017-07-15
    相关资源
    最近更新 更多