【问题标题】:group some row in resilt table在 resilt 表中对某些行进行分组
【发布时间】:2016-09-16 07:50:40
【问题描述】:

我需要从结果表中选择一组行。我已经写了 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
);

并插入:

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);

我需要得到结果表:

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 的值太多

如何写出正确的“选择”?

抱歉,有一些新条件。该表可以包含具有相同 Document_number 和不同 ID_customer 的行。此行不得汇总。

例子:

1 input_saldo 111222 300 2 input_saldo 222333 600 4 输出萨尔多 444555 600 3 输出萨尔多 333444 400 11 TN0001 333444 600 --!!!!!!! 5 TN0001 444555 600 --!!!!!!! 6 TN0002 444555 700 ......

我尝试执行:

SELECT DOCUMENT_NUMBER, ID_CUSTOMER, SUM(BASE_AMOUNT)
FROM MONEY_ACTIVITY
GROUP BY DOCUMENT_NUMBER, ID_CUSTOMER;

返回结果是:

DOCUMENT_NUMBER ID_CUSTOMER SUM(BASE_AMOUNT)

input_saldo 222333  600
input_saldo 111222  300
ouput_saldo 333444  400
ouput_saldo 444555  600
TN0001  444555  600
TN0001  333444  600
TN0002  444555  700
TN0003  333444  600
TN0004  333444  700
TN0005  111444  600
TN0006  222444  700

但我需要:

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

【问题讨论】:

  • 跳过子查询,改为执行 JOIN。
  • 1 input_saldo 111222 300 2 input_saldo 222333 600 4 ouput_saldo 444555 600 3 ouput_saldo 333444 400 11 TN0001 333444 600 --!!!!!!! 5 TN0001 444555 600 --!!!!!!! 6 TN0002 444555 700 ......

标签: sql oracle group-by


【解决方案1】:

只需使用 GROUP BY-

SELECT DOCUMENT_NUMBER ,SUM(BASE_AMOUNT)
FROM MONEY_ACTIVITY  
GROUP BY DOCUMENT_NUMBER 

【讨论】:

    【解决方案2】:

    您可以应用聚合函数,例如:

    SELECT DOCUMENT_NUMBER, SUM(BASE_AMOUNT)
    FROM MONEY_ACTIVITY
    GROUP BY DOCUMENT_NUMBER
    ORDER BY 1
    

    【讨论】:

      【解决方案3】:

      我认为该错误是因为您的子查询应返回一个值 (sum(BASE_AMOUNT))。 从子查询中删除 DOCUMENT_NUMBER 列。

      【讨论】:

        【解决方案4】:

        不是由查询逻辑的优点限制我自己只报告错误..子查询返回两列,而结果应该只包含一列

        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');
        

        【讨论】:

          【解决方案5】:

          从您的数据样本中,一个简单的聚合就可以完成工作:

          select DOCUMENT_NUMBER, sum(BASE_AMOUNT)
          from MONEY_ACTIVITY
          group by DOCUMENT_NUMBER
          

          如果您需要更复杂的逻辑,请编辑您的问题以更好地解释您的需求

          【讨论】:

            【解决方案6】:

            您有一个子查询来填充一个标量值,并且该子查询返回两个值。 根据上面的 MarinC 回答,您可以从子查询中删除 DOCUMENT_NUMBER。

            您的查询看起来也有问题,因为您似乎拼错了“output_saldo”,并且您明确排除了两个“...saldo”值,因此它们无论如何都不会出现在结果集中。

            这在不使用子查询的情况下完成了您似乎在问的事情;

            SELECT document_number, SUM(base_amount) 
              FROM money_activity
            GROUP BY document_number
            ORDER BY document_number desc
            

            【讨论】:

              【解决方案7】:

              为什么不使用简单查询?

              SELECT DOCUMENT_NUMBER,SUM(BASE_AMOUNT)
              FROM MONEY_ACTIVITY
              GROUP BY DOCUMENT_NUMBER 
              

              【讨论】:

              • 谢谢JaydipJ!
              【解决方案8】:
              select 
                  case when DOCUMENT_NUMBER in ('input_saldo', 'ouput_saldo')  then DOCUMENT_NUMBER else DOCUMENT_NUMBER_1 end DOCUMENT_NUMBER,
                  case when DOCUMENT_NUMBER in ('input_saldo', 'ouput_saldo')  then BASE_AMOUNT else BASE_AMOUNT_1 end BASE_AMOUNT,
                  case when DOCUMENT_NUMBER in ('input_saldo', 'ouput_saldo') then null else ID_CUSTOMER_1 end ID_CUSTOMER
              from 
                  (select DOCUMENT_NUMBER, 
                      sum(BASE_AMOUNT) BASE_AMOUNT,  
                      DOCUMENT_NUMBER_1, 
                      BASE_AMOUNT_1, 
                      ID_CUSTOMER_1
                  from 
                      (select 
                          case when DOCUMENT_NUMBER in ('input_saldo', 'ouput_saldo')  then DOCUMENT_NUMBER else null end DOCUMENT_NUMBER,
                          case when DOCUMENT_NUMBER in ('input_saldo', 'ouput_saldo') then BASE_AMOUNT else null end BASE_AMOUNT,
                          case when DOCUMENT_NUMBER in ('input_saldo', 'ouput_saldo') then  null else ID end ID_1,
                          case when DOCUMENT_NUMBER in ('input_saldo', 'ouput_saldo') then null else DOCUMENT_NUMBER end DOCUMENT_NUMBER_1,
                          case when DOCUMENT_NUMBER in ('input_saldo', 'ouput_saldo') then  null else BASE_AMOUNT end BASE_AMOUNT_1,
                          case when DOCUMENT_NUMBER in ('input_saldo', 'ouput_saldo') then  null else ID_CUSTOMER end ID_CUSTOMER_1          
                      from MONEY_ACTIVITY)
                  group by DOCUMENT_NUMBER, DOCUMENT_NUMBER_1, BASE_AMOUNT_1, ID_CUSTOMER_1);
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2012-02-18
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多