区分全额退款与部分退款

时间:2018-07-26 15:53:52

标签: sql sql-server

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

我有2个表,订单标题和订单行(标题表具有CustomerId,OrderId,OrderDate,OrderGuid,OrderType,Amount,Reasoncode) (行Tabe具有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

在第leveL行相同:

 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

希望这很有意义。 请问我有什么问题。先感谢您。 最好

2 个答案:

答案 0 :(得分:0)

以下是通过示例解决方案重述您的问题的信息, 但是一个简单的问题是为什么FN2-RF1被视为部分退款?由于在您的示例中,订单项的总和=贷记金额。

http://rextester.com/EODK86280

答案 1 :(得分:0)

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

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

创建[标题]表并插入数据:

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 |
+-----------+--------+-----+

查看参考金额销售金额的比较,以了解其工作原理。