Sql 将重定大小表中的某些行分组

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

我需要从结果表中选择一组行。我已编写select,但有错误消息ORA-00913。如何写一个正确的选择?我有一个 结果表:

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……谢谢你,杰迪普!