sql行分离

时间:2015-12-30 03:21:40

标签: sql sql-server

表架构:

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或更高版本。

1 个答案:

答案 0 :(得分:1)

我不确定行分离方法,但是为了获得此1-1(负数和正数)值,您可以订购输出。

您可以根据交易订购,然后根据您的金额绝对价值订购 -

select * from <your_table_name> order by Transaction, abs(Amount)