表架构:
Create Table
(
Transaction CHAR(18),
Serial INT,
Project CHAR(3),
Amount MONEY
CONSTRAINT [PK_TRANSACTION_SERIAL] PRIMARY KEY CLUSTERED
(
Transaction ASC,
Serial ASC
)
)
数据集:
+-----------------+-------+---------+---------+
| Transaction | Serial| Project | Amount |
+-----------------+-------+---------+---------+
| A00000000000001 | 1 | 100 | 500 |
| A00000000000001 | 2 | 200 | -200 |
| A00000000000001 | 3 | 200 | -100 |
| A00000000000001 | 4 | 101 | -200 |
| A00000000000002 | 1 | 100 | 100 |
| A00000000000002 | 2 | 101 | -100 |
| A00000000000003 | 1 | 100 | 300 |
| A00000000000003 | 2 | 200 | -300 |
| A00000000000004 | 1 | 200 | -200 |
| A00000000000004 | 2 | 100 | 100 |
| A00000000000004 | 3 | 101 | 100 |
| A00000000000005 | 1 | 200 | 200 |
| A00000000000005 | 2 | 100 | -300 |
| A00000000000005 | 3 | 101 | 100 |
+-----------------+-------+---------+---------+
对于任何交易,将有多个正余额对多个负余额或1个负对多个正余额。 对于许多负数,没有多少正交金额的交易。
具有1个正数和1个负数的交易是最佳情况。
我的目标是使所有交易1到1如下。
在项目200的输出量的第一行合并为第2行和第2行数据集具有相同的事务和同一项目。
此处,每个事务的最大ABS(金额)行将根据该事务的其他行的数量值分成多行。
输出:
+-----------------+---------+---------+
| Transaction | Project | Amount |
+-----------------+---------+---------+
| A00000000000001 | 100 | 300 |
| A00000000000001 | 200 | -300 |
---------------------------------------
| A00000000000001 | 100 | 200 |
| A00000000000001 | 101 | -200 |
---------------------------------------
| A00000000000002 | 100 | 100 |
| A00000000000002 | 101 | -100 |
---------------------------------------
| A00000000000003 | 100 | 300 |
| A00000000000003 | 200 | -300 |
---------------------------------------
| A00000000000004 | 200 | -100 |
| A00000000000004 | 100 | 100 |
---------------------------------------
| A00000000000004 | 200 | -100 |
| A00000000000004 | 101 | 100 |
---------------------------------------
| A00000000000005 | 200 | 200 |
| A00000000000005 | 100 | -200 |
---------------------------------------
| A00000000000005 | 101 | 100 |
| A00000000000005 | 100 | -100 |
+-----------------+---------+---------+
我正在使用SQL SERVER 2012或更高版本。
答案 0 :(得分:1)
我不确定行分离方法,但是为了获得此1-1
(负数和正数)值,您可以订购输出。
您可以根据交易订购,然后根据您的金额绝对价值订购 -
select *
from <your_table_name>
order by Transaction, abs(Amount)