[英]Inserting the data from one table to another by grouping one column in 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中帐户A1,A3的行1,7。 但是我想只用一行将数据插入到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列是帐户A1的DR和A1等的CR。)
谁能帮我实现这一目标?
您可以通过标准的数据透视查询来执行此操作:
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
值。 如果是这样,那么您应该对问题进行解释。
如果您使用的是Oracle 11g,则有一种标准的方法,这种方法甚至更短:
SELECT *
FROM tab
pivot (MAX(dr) dr, MAX(cr) cr FOR (ACCOUNT) IN ('A1' AS a1, 'A2' as a2, 'A3' AS a3))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.