Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL—分组中两个值的总和_Sql_Oracle - Fatal编程技术网

SQL—分组中两个值的总和

SQL—分组中两个值的总和,sql,oracle,Sql,Oracle,我正在尝试添加两个值或获取两个值的总和,并在一个交换名称下显示它。数据如下: Table -------------------------------------------------- EXCHANGE NAME CODE TURNOVER TRADEDATE PARIS PA 12 14-NOV-2019 SWISS SW 14

我正在尝试添加两个值或获取两个值的总和,并在一个交换名称下显示它。数据如下:

Table
--------------------------------------------------
EXCHANGE NAME       CODE        TURNOVER    TRADEDATE
PARIS               PA            12        14-NOV-2019
SWISS               SW            14        14-NOV-2019
NULL                SA             2        14-NOV-2019
NULL                MI             2        14-NOV-2019
MILAN               MI_1           3        14-NOV-2019

My Query
----------------------------------------------------
SELECT CE.EXCHANGE_NAME, sum(CE.TURNOVER)  
FROM CE
WHERE CE.tradedate = '14-NOV-2019'
GROUP BY CE.EXCHANGE_NAME

Result
-----------------------------------------------------
EXCHANGE NAME       SUM
PARIS               12
SWISS               14
MILAN               3
我想要达到的是瑞士队的总人数是16人,米兰队是5人,因为米兰也属于米兰队。交换名称有空值,但它们属于某个交换(本例中为瑞士和米兰),即代码SA属于瑞士,MI属于米兰

在瑞士和米兰这样的情况下,我如何在查询时考虑到这一点,因为我知道哪些代码属于EXCHANGE\u名称

非常感谢

您可以使用
COALESCE()
EXCHANGE\u NAME
值设置为
'SWISS'

SELECT COALESCE(CE.EXCHANGE_NAME, 'SWISS'), sum(CE.TURNOVER)  
FROM CE
WHERE CE.tradedate = '14-NOV-2019'
GROUP BY COALESCE(CE.EXCHANGE_NAME, 'SWISS')

编辑:您可以使用方便的Oracle函数
decode()
代码
映射到默认的
交换名称

SELECT 
    COALESCE(
        CE.EXCHANGE_NAME, 
        DECODE(CE.CODE, 'SA', 'SWISS', 'MI_1', 'MILAN')
    ) EXCHANGE, 
    SUM(CE.TURNOVER)  
FROM CE
WHERE CE.tradedate = '14-NOV-2019'
GROUP BY COALESCE(
        CE.EXCHANGE_NAME, 
        DECODE(CE.CODE, 'SA', 'SWISS', 'MI_1', 'MILAN')
    )
您可以根据用例的需要展开
DECODE()
参数。

您可以使用
COALESCE()

注意:我喜欢对日期常量使用
DATE

WHERE CE.tradedate = DATE '2019-11-14'
这允许使用ISO标准日期格式

编辑:

使用
大小写
表达式:

SELECT (CASE WHEN CE.CODE = 'SA' THEN 'SWISS'
             WHEN CE.CODE = 'MI_1' THEN 'MILAN'
             ELSE CE.EXCHANGE_NAME
        END) as EXCHANGE_NAME,
       SUM(CE.TURNOVER)  
FROM CE
WHERE CE.tradedate = DATE '2019-11-14'
GROUP BY (CASE WHEN CE.CODE = 'SA' THEN 'SWISS'
               WHEN CE.CODE = 'MI_1' THEN 'MILAN'
               ELSE CE.EXCHANGE_NAME
          END);

在我看来,您必须创建一个映射表,将代码映射到交换名称:

SQL> create table exmap
  2    (exchange_name varchar2(20),
  3     code          varchar2(10));

Table created.

SQL> insert into exmap
  2    select 'PARIS', 'PA'   from dual union all
  3    select 'SWISS', 'SW'   from dual union all
  4    select 'SWISS', 'SA'   from dual union all
  5    select 'MILAN', 'MI'   from dual union all
  6    select 'MILAN', 'MI_1' from dual;

5 rows created.

SQL>
现在,使用
CE
表(您发布的那一个)中的日期,您可以连接这两个表:

SQL> select e.exchange_name,
  2         sum(c.turnover) sum_turnover
  3  from ce c join exmap e on e.code = c.code
  4  group by e.exchange_name;

EXCHANGE_NAME        SUM_TURNOVER
-------------------- ------------
PARIS                          12
MILAN                           5
SWISS                          16

SQL>
为什么要这样做?因为迟早你会在
CE
表中添加类似的内容(所以巴黎现在是20):

现在,如果您选择在代码中维护映射,则必须在所有存储过程、报表、表单中的所有位置修复映射。。。使用该表的内容,并添加另一个
案例
,例如

case when code in ('PA', 'PR') then 'PARIS'
     ...                 ^^^^
                         this
那可能会让你发疯。但是,如果只是将其添加到映射表中:

SQL> insert into exmap values ('PARIS', 'PR');

1 row created.
“旧”联接查询将工作,无需任何进一步操作:

SQL> select e.exchange_name,
  2         sum(c.turnover) sum_turnover
  3  from ce c join exmap e on e.code = c.code
  4  group by e.exchange_name;

EXCHANGE_NAME        SUM_TURNOVER
-------------------- ------------
PARIS                          20
MILAN                           5
SWISS                          16

SQL>

如果其他
交换名称
空值
该怎么办?@yogesharma。OP明确指出:“EXCHANGE NAME有空值,但它们属于某个EXCHANGE(本例中为瑞士),即代码SA属于瑞士。”@GordonLinoff抱歉,是的,我本应指定并编辑此问题,我与其他EXCHANGE也有类似问题。@GordonLinoff Hi Gordon,你能帮忙吗?如果其他
交易所名称
空值
怎么办?OP说:交易所名称有空值,但它们属于某个交易所(在这种情况下是瑞士)。@GMB我对其他交易所也有这个问题。抱歉,我编辑了这个问题。@AM_86:那么我们如何确定应该将
NULL
值分配给哪个交易所?@GMB基于代码…我将进一步编辑这个问题。如果其他
交易所名称
具有
NULL
值怎么办?您将不得不使用超前和滞后功能here@YogeshSharma我就是这样想的另外两家交易所也有类似的问题,我需要一个解决方案来帮助我应对这些情况;你就不能按代码分组吗?
SQL> insert into exmap values ('PARIS', 'PR');

1 row created.
SQL> select e.exchange_name,
  2         sum(c.turnover) sum_turnover
  3  from ce c join exmap e on e.code = c.code
  4  group by e.exchange_name;

EXCHANGE_NAME        SUM_TURNOVER
-------------------- ------------
PARIS                          20
MILAN                           5
SWISS                          16

SQL>