首页 > 解决方案 > 通过在 Oracle 中对一列进行分组,将数据从一个表插入到另一个表

问题描述

我有一张桌子

表格1

LEDGER      SOURCE    CATEGORY    ACCOUNT   DR          CR
-------    --------   ---------  --------  ------      -------
ABC          JS1       JE1         A1     123456.7      2345.6
ABC          JS1       JE2         A1     16.7          345.6
ABC          JS2       JE3         A1     13456.7       10
ABC          JS3       JE4         A2     1456.7        45.6
ABC          JS1       JE2         A2     16            345
ABC          JS3       JE5         A2     2456.7        2.6
ABC          JS1       JE1         A3     156.7         25.6    .........

我想按来源和类别将此数据插入另一个表(表 2)。

例如,我有两行用于来源和类别 JS1、JE1,即表 1 中的第 1,7 行用于帐户 A1、A3。但我想将这些数据插入到 table2 中,只有一行,如下所示

表:2

LEDGER SOURCE  CATEGORY  DR_A1  CR_A1   DR_A2  CR_A2  DR_A3  CR_A3
------ ------  -------   ------ ------  -----  -----  -----  ----
ABC    JS1     JE1       1234.7  2345.6 0       0      156.7  5.6
ABC    JS1     JE2       16.7    345.6  16      345    0      0
ABC    JS2     JE3       1346.7  10     0       0      0      0
ABC    JS3     JE4       0       0      1456.7  45.6   0      0
ABC    JS3     JE5       0       0      2456.7  2.6    0      0 

(注:DR_A1、CR_A1 列是 Account A1 的 DR 和 A1 的 CR 等。)

谁能帮我实现这一目标?

标签: sqloracleplsql

解决方案


您可以通过标准的数据透视查询来做到这一点:

INSERT INTO Table2 (LEDGER, SOURCE, CATEGORY, DR_A1, CR_A1, DR_A2, CR_A2, DR_A3, CR_A3)
SELECT
    LEDGER,
    SOURCE,
    CATEGORY,
    MAX(CASE WHEN ACCOUNT = 'A1' THEN DR END) AS DR_A1,
    MAX(CASE WHEN ACCOUNT = 'A1' THEN CR END) AS CR_A1,
    MAX(CASE WHEN ACCOUNT = 'A2' THEN DR END) AS DR_A2,
    MAX(CASE WHEN ACCOUNT = 'A2' THEN CR END) AS CR_A2,
    MAX(CASE WHEN ACCOUNT = 'A3' THEN DR END) AS DR_A3,
    MAX(CASE WHEN ACCOUNT = 'A3' THEN CR END) AS CR_A3
FROM Table1
GROUP BY
    LEDGER,
    SOURCE,
    CATEGORY;

但是看看您的预期输出,您似乎也在插入期间调整DR/CR值。如果是这样,那么您应该在您的问题中添加一个关于正在发生的事情的解释。


推荐阅读