sql - 通过在 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 等。)
谁能帮我实现这一目标?
解决方案
您可以通过标准的数据透视查询来做到这一点:
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
值。如果是这样,那么您应该在您的问题中添加一个关于正在发生的事情的解释。
推荐阅读
- jenkins - Jenkins和终端之间的不同模拟器设备ID
- python - 在离线环境中分发 Python 应用程序和解释器的最佳方式是什么?
- java - Java,如何找出哪个类或方法占用大量内存?
- javascript - 如何在 Angular js 1 中获取 ng-repeat 项目计数?
- javascript - 视频出现在窗口中间时如何播放?
- node.js - 在 socket.io 上,我是否总是必须对每个 emit() 进行身份验证,而不仅仅是在建立连接时进行身份验证?
- c++ - SDL_Texture 似乎在运行时更改为 NULL,导致 EXC_BAD_ACCESS
- c++ - 在数组中创建位置层次结构
- extjs - ext.net 1 - 如何根据后面代码中的行数据构造div元素ID
- android - 导航架构不使用单个 Activity