我有一个名为payment_info的表,有以下记录。

paymentid | customercode | previousbalance | paymentamount | remainingbalance
-----------------------------------------------------------------------------
PID0001   |    CUST024   |    10000        |     2500      |   7500
PID0002   |    CUST031   |    8500         |     3500      |   5000
PID0003   |    CUST005   |    12000        |     1500      |   10500

然后我想在上面的表中每行创建3行。
我希望我的结果是这样的。
Payment Group | Payment Line Item | Payment ID | Customer Code |     Type            | Amount
--------------------------------------------------------------------------------------------------
   1          |         1         |  PID0001   |   CUST024     | PREVIOUS BALANCE    | 10000.00
   1          |         2         |            |               | PAYMENT AMOUNT      | 2500.00
   1          |         3         |            |               | REMAINING BALANCE   | 7500.00

   2          |         1         |  PID0002   |   CUST031     | PREVIOUS BALANCE    | 8500.00
   2          |         2         |            |               | PAYMENT AMOUNT      | 3500.00
   2          |         3         |            |               | REMAINING BALANCE   | 5000.00

   3          |         1         |  PID0003   |   CUST005     | PREVIOUS BALANCE    | 12000.00
   3          |         2         |            |               | PAYMENT AMOUNT      | 1500.00
   3          |         3         |            |               | REMAINING BALANCE   | 10500.00

这是我开始的查询。但它没有返回与上述相同的结果。
select row_number() over() as id,paymentid,customercode,'PREVIOUS BALANCE' as type,previousbalance from payment_info
union
select row_number() over() as id,'','','PAYMENT AMOUNT' as type,paymentamount from payment_info
union
select row_number() over() as id,'','','REMAINING BALANCE' as type,remainingbalance from payment_info

有没有其他方法,我将不使用联合关键字?因为在真正的表中,我将使用30多列,查询数千条记录。
我也不知道如何从付款组(每个付款id)和付款行项目(每个组)创建自动生成的编号(id)。
谢谢

最佳答案

带空白的版本(空文本)
unnest函数可以为您执行此操作。
如果你想要空文本,你可以用这个

SELECT ROW_NUMBER() OVER (ORDER BY paymentid) AS "group",
unnest(array[1, 2, 3]) AS "line item",
unnest(array[paymentid, '', '']) AS "paymentid",
unnest(array[customercode, '', '']) AS "customercode",
unnest(array['PREVIOUS BALANCE', 'PAYMENT AMOUNT', 'REMAINING BALANCE']) AS "type",
unnest(array[previousbalance, paymentamount, remainingbalance]) AS "amount"
FROM payment_info
ORDER BY 1, 2 ;

为了得到这个
 group | line item | paymentid | customercode |       type        | amount
-------+-----------+-----------+--------------+-------------------+--------
     1 |         1 | PID0001   | CUST024      | PREVIOUS BALANCE  |  10000
     1 |         2 |           |              | PAYMENT AMOUNT    |   2500
     1 |         3 |           |              | REMAINING BALANCE |   7500
     2 |         1 | PID0002   | CUST031      | PREVIOUS BALANCE  |   8500
     2 |         2 |           |              | PAYMENT AMOUNT    |   3500
     2 |         3 |           |              | REMAINING BALANCE |   5000
     3 |         1 | PID0003   | CUST005      | PREVIOUS BALANCE  |  12000
     3 |         2 |           |              | PAYMENT AMOUNT    |   1500
     3 |         3 |           |              | REMAINING BALANCE |  10500

如果您希望在空文本列中包含点或其他文本或箭头,可以使用unnest轻松完成此操作。
您可以单独控制4个空文本值。
SELECT ROW_NUMBER() OVER (ORDER BY paymentid) AS "group",
unnest(array[1, 2, 3]) AS "line item",
unnest(array[paymentid, '      a', '      c']) AS "paymentid",
unnest(array[customercode, '      b', '      d']) AS "customercode",
unnest(array['PREVIOUS BALANCE', 'PAYMENT AMOUNT', 'REMAINING BALANCE']) AS "type",
unnest(array[previousbalance, paymentamount, remainingbalance]) AS "amount"
FROM payment_info
ORDER BY 1, 2 ;

产生
 group | line item | paymentid | customercode |       type        | amount
-------+-----------+-----------+--------------+-------------------+--------
     1 |         1 | PID0001   | CUST024      | PREVIOUS BALANCE  |  10000
     1 |         2 |       a   |       b      | PAYMENT AMOUNT    |   2500
     1 |         3 |       c   |       d      | REMAINING BALANCE |   7500
     2 |         1 | PID0002   | CUST031      | PREVIOUS BALANCE  |   8500
     2 |         2 |       a   |       b      | PAYMENT AMOUNT    |   3500
     2 |         3 |       c   |       d      | REMAINING BALANCE |   5000
     3 |         1 | PID0003   | CUST005      | PREVIOUS BALANCE  |  12000
     3 |         2 |       a   |       b      | PAYMENT AMOUNT    |   1500
     3 |         3 |       c   |       d      | REMAINING BALANCE |  10500

你知道,这是一个非常灵活的解决方案。

关于sql - PostgreSQL-将单行更改为多行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43840724/

10-13 06:41