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>