我想区分全额退款与部分退款。 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
希望这很有意义。 请问我有什么问题。先感谢您。 最好
答案 0 :(得分:0)
以下是通过示例解决方案重述您的问题的信息, 但是一个简单的问题是为什么FN2-RF1被视为部分退款?由于在您的示例中,订单项的总和=贷记金额。
答案 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 |
+-----------+--------+-----+
查看参考金额与销售金额的比较,以了解其工作原理。