Sql 将重定大小表中的某些行分组
我需要从结果表中选择一组行。我已编写select,但有错误消息ORA-00913。如何写一个正确的选择?我有一个 结果表:Sql 将重定大小表中的某些行分组,sql,oracle,group-by,Sql,Oracle,Group By,我需要从结果表中选择一组行。我已编写select,但有错误消息ORA-00913。如何写一个正确的选择?我有一个 结果表: DROP TABLE MONEY_ACTIVITY; CREATE TABLE MONEY_ACTIVITY ( ID NUMBER(15) NOT NULL, DOCUMENT_NUMBER VARCHAR2(13) NULL, ID_CUSTOMER NUMBER
DROP TABLE MONEY_ACTIVITY;
CREATE TABLE MONEY_ACTIVITY (
ID NUMBER(15) NOT NULL,
DOCUMENT_NUMBER VARCHAR2(13) NULL,
ID_CUSTOMER NUMBER NULL,
BASE_AMOUNT NUMBER(5,2) NULL
);
input_saldo 900
ouput_saldo 1000
TN0001 600
TN0002 700
TN0003 600
TN0004 700
TN0005 600
TN0006 700
并插入:
INSERT INTO MONEY_ACTIVITY VALUES (1, 'input_saldo', 111222, 300);
INSERT INTO MONEY_ACTIVITY VALUES (2, 'input_saldo', 222333, 600);
INSERT INTO MONEY_ACTIVITY VALUES (3, 'ouput_saldo', 333444, 400);
INSERT INTO MONEY_ACTIVITY VALUES (4, 'ouput_saldo', 444555, 600);
INSERT INTO MONEY_ACTIVITY VALUES (5, 'TN0001', 444555, 600);
INSERT INTO MONEY_ACTIVITY VALUES (6, 'TN0002', 444555, 700);
INSERT INTO MONEY_ACTIVITY VALUES (7, 'TN0003', 333444, 600);
INSERT INTO MONEY_ACTIVITY VALUES (8, 'TN0004', 333444, 700);
INSERT INTO MONEY_ACTIVITY VALUES (9, 'TN0005', 111444, 600);
INSERT INTO MONEY_ACTIVITY VALUES (10, 'TN0006', 222444, 700);
我需要得到结果表:
DROP TABLE MONEY_ACTIVITY;
CREATE TABLE MONEY_ACTIVITY (
ID NUMBER(15) NOT NULL,
DOCUMENT_NUMBER VARCHAR2(13) NULL,
ID_CUSTOMER NUMBER NULL,
BASE_AMOUNT NUMBER(5,2) NULL
);
input_saldo 900
ouput_saldo 1000
TN0001 600
TN0002 700
TN0003 600
TN0004 700
TN0005 600
TN0006 700
我正在努力:
select
case when DOCUMENT_NUMBER = 'input_saldo' then (select DOCUMENT_NUMBER, SUM(BASE_AMOUNT)
from MONEY_ACTIVITY
where DOCUMENT_NUMBER = 'input_saldo'
group by DOCUMENT_NUMBER) end case,
case when DOCUMENT_NUMBER = 'ouput_saldo' then (select DOCUMENT_NUMBER, SUM(BASE_AMOUNT)
from MONEY_ACTIVITY
where DOCUMENT_NUMBER = 'ouput_saldo'
group by DOCUMENT_NUMBER) end case,
DOCUMENT_NUMBER,
BASE_AMOUNT
from MONEY_ACTIVITY
where DOCUMENT_NUMBER NOT IN ('input_saldo', 'output_saldo');
但是ora-00913的值太多了
如何写正确的“选择”
对不起,有一些新的条件。该表可以包含具有相同文档编号和不同客户ID的行。这些行不能相加或汇总
例如:
1个输入端\u saldo 111222 300
2个输入端\u saldo 222333 600
4 ouput_saldo 444555 600
3 ouput_saldo 333444 400
11 TN0001 333444 600--!!!!!!!
5 TN0001 44555 600--!!!!!!!
6TN000244555700
我试着执行:
SELECT DOCUMENT_NUMBER, ID_CUSTOMER, SUM(BASE_AMOUNT)
FROM MONEY_ACTIVITY
GROUP BY DOCUMENT_NUMBER, ID_CUSTOMER;
返回结果为:
文件编号ID客户金额(基本金额)
但我需要:
input_saldo 111222 900
ouput_saldo 444555 1000
TN0001 444555 600
TN0001 333444 600
TN0002 444555 700
TN0003 333444 600
TN0004 333444 700
TN0005 111444 600
TN0006 222444 700
我认为这个错误是因为子查询应该返回一个值(sum(BASE_AMOUNT))。
从子查询中删除列文档编号。不考虑查询逻辑的优点,仅限于报告的错误。。子查询返回两列,而结果应仅包含一列
select
case when DOCUMENT_NUMBER = 'input_saldo' then (select SUM(BASE_AMOUNT)
from MONEY_ACTIVITY
where DOCUMENT_NUMBER = 'input_saldo'
group by DOCUMENT_NUMBER) end case,
case when DOCUMENT_NUMBER = 'ouput_saldo' then (select SUM(BASE_AMOUNT)
from MONEY_ACTIVITY
where DOCUMENT_NUMBER = 'ouput_saldo'
group by DOCUMENT_NUMBER) end case,
DOCUMENT_NUMBER,
BASE_AMOUNT
from MONEY_ACTIVITY
where DOCUMENT_NUMBER NOT IN ('input_saldo', 'output_saldo');
从您的数据示例中,一个简单的聚合可以完成以下工作:
select DOCUMENT_NUMBER, sum(BASE_AMOUNT)
from MONEY_ACTIVITY
group by DOCUMENT_NUMBER
如果您需要更复杂的逻辑,请编辑您的问题以更好地解释您的需要为什么不使用简单查询
SELECT DOCUMENT_NUMBER,SUM(BASE_AMOUNT)
FROM MONEY_ACTIVITY
GROUP BY DOCUMENT_NUMBER
简单地使用分组方式-
SELECT DOCUMENT_NUMBER ,SUM(BASE_AMOUNT)
FROM MONEY_ACTIVITY
GROUP BY DOCUMENT_NUMBER
您有一个子查询来填充标量值,子查询返回两个值。 根据上面的MarinC答案,您可以从子查询中删除文档编号 您的查询看起来也是错误的,因为您似乎拼写错误了“output_saldo”,并且您特别排除了两个“…saldo”值,因此它们无论如何都不会出现在结果集中 这就是你在不使用子查询的情况下提出的问题
SELECT document_number, SUM(base_amount)
FROM money_activity
GROUP BY document_number
ORDER BY document_number desc
您可以应用聚合函数,例如:
SELECT DOCUMENT_NUMBER, SUM(BASE_AMOUNT)
FROM MONEY_ACTIVITY
GROUP BY DOCUMENT_NUMBER
ORDER BY 1
跳过子查询,改为加入。1输入\u saldo 111222 300 2输入\u saldo 222333 600 4输出\u saldo 44555 600 3输出\u saldo 333444 400 11 TN0001 333444 600--!!!!!!!5 TN0001 44555 600--!!!!!!!6TN000244555700……谢谢你,杰迪普!