首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >避免重复条目使用完全连接和组

避免重复条目使用完全连接和组
EN

Stack Overflow用户
提问于 2018-11-25 18:25:42
回答 2查看 2.2K关注 0票数 0

我对数据库使用了HSQLDB,在连接两个表时,我必须避免重复条目。

Table1

代码语言:javascript
复制
HMEXPENSE
+--------+---------------+-------------+
| USERID | EXPENSEAMOUNT | EXPENSEDATE |
+--------+---------------+-------------+
|      a |      100      | 2018-10-10  |
|      a |      200      | 2018-10-11  |
|      a |      100      | 2018-10-11  |
|      a |      200      | 2018-10-13  |
+--------+---------------+-------------+

Table2

代码语言:javascript
复制
HMINCOME
+--------+---------------+-------------+
| USERID | EXPENSEAMOUNT | EXPENSEDATE |
+--------+---------------+-------------+
|      a |      200      | 2018-10-10  |
|      a |      100      | 2018-10-11  |
|      a |      200      | 2018-10-11  |
|      a |      100      | 2018-10-12  |
+--------+---------------+-------------+

提供重复条目的当前查询如下所示

代码语言:javascript
复制
SELECT e.expenseDate ,i.incomeDate , SUM(e.expenseAmount), SUM(i.incomeAmount)
FROM HMINCOME i FULL JOIN HMEXPENSE e on i.incomeDate = e.expenseDate 
GROUP BY i.incomeDate,e.expenseDate, i.incomeAmount, e.expenseAmount

输出

代码语言:javascript
复制
+-------------+------------+-------+-------+
| EXPENSEDATE | INCOMEDATE |   C3  |   C4  |
+-------------+------------+-------+-------+
|  2018-10-10 | 2018-10-10 | 100.0 | 200.0 |
|  2018-10-11 | 2018-10-11 | 200.0 | 100.0 |
|  2018-10-11 | 2018-10-11 | 100.0 | 100.0 |
|  2018-10-11 | 2018-10-11 | 200.0 | 200.0 |
|  2018-10-11 | 2018-10-11 | 100.0 | 200.0 |
|   <null>    | 2018-10-12 | <null>| 100.0 |
|  2018-10-13 |   <null>   | 200.0 | <null>|
+-------------+------------+-------+-------+

如果我使用上面提到的查询来获得实际的输出,我的实际场景中需要的输出如下所示

代码语言:javascript
复制
SELECT e.expenseDate, i.incomeDate , SUM(e.expenseAmount),SUM(i.incomeAmount)
FROM HMINCOME i FULL JOIN HMEXPENSE e on i.incomeDate = e.expenseDate 
GROUP BY i.incomeDate,e.expenseDate

输出

代码语言:javascript
复制
+-------------+------------+-------+-------+
| EXPENSEDATE | INCOMEDATE |   C3  |   C4  |
+-------------+------------+-------+-------+
|  2018-10-10 | 2018-10-10 | 100.0 | 200.0 |
|  2018-10-11 | 2018-10-11 | 600.0 | 600.0 |
|   <null>    | 2018-10-12 | <null>| 100.0 |
|  2018-10-13 |   <null>   | 200.0 | <null>|
+-------------+------------+-------+-------+

要求获取单个日的金额和另一个表中不存在的日期的空项。

预期产出如下

代码语言:javascript
复制
+-------------+------------+-------+-------+
| EXPENSEDATE | INCOMEDATE |   C3  |   C4  |
+-------------+------------+-------+-------+
|  2018-10-10 | 2018-10-10 | 100.0 | 200.0 |
|  2018-10-11 | 2018-10-11 | 300.0 | 300.0 |
|   <null>    | 2018-10-12 | <null>| 100.0 |
|  2018-10-13 |   <null>   | 200.0 | <null>|
+-------------+------------+-------+-------+

由于重复的条目,无法正确计算C3和C4列值。

救命..。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-25 19:24:23

解决这一问题的一种方法是使用union allgroup by

代码语言:javascript
复制
select dte, sum(incomeamount) as incomeamount, sum(expenseamount) as expenseamount
from ((select incomedate as dte, incomeamount, 0 as expenseamount
       from hmincome
      ) union all
      (select expensedate, 0, expenseAmount
       from hmexpense
      )
     ) ie
group by dte
order by dte;
票数 2
EN

Stack Overflow用户

发布于 2018-11-25 18:45:49

这里的问题是,表中的日期有多个行。因此,我们需要首先在子查询中聚合它们。然后,它将被用于执行FULL JOIN

尝试:

代码语言:javascript
复制
SELECT 
  e.expenseDate,
  i.incomeDate, 
  e.sumExpenseAmount, 
  i.sumIncomeAmount
FROM 
(SELECT incomeDate, SUM(incomeAmount) sumIncomeAmount
 FROM HMINCOME
 GROUP BY incomeDate) i
FULL JOIN 
(SELECT expenseDate, SUM(expenseAmount) sumExpenseAmount
 FROM HMEXPENSE
 GROUP BY expenseDate) e
  ON i.incomeDate = e.expenseDate 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53470556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档