MYSQL按子查询分组,但需要所有数据

萨图·苏丹娜(Satu Sultana)

我有两个表,一个是交易,另一个是支出

交易表:

id  amount  created
1   300     2019-10-01 00:00:00
2   200     2019-11-01 00:00:00
3   230     2019-11-13 00:00:00
4   130     2019-11-13 00:00:00

费用表:

id  amount  created
1   600     2019-11-13 00:00:00

两个表的总和,我在下面写了查询,对我来说很好。

(SELECT IFNULL(date(t1.created), date(ex.created)) as Date , sum(t1.amount) as ReceiveAmount,ex.amount as ExpensesAmount 
    FROM transactions as t1
    LEFT JOIN (
        SELECT sum(e.amount) as amount, created
           FROM expenses as e 
           group by date(e.created)
        ) as ex
    ON date(ex.created) =  date(t1.created)
    GROUP BY date(t1.created))

    UNION

    (SELECT IFNULL(date(t1.created), date(ex.created)) as Date, sum(t1.amount) as Receive,ex.amount as ExpensesAmount 
    FROM transactions as t1

    RIGHT JOIN (
        SELECT sum(e.amount) as amount, created
        FROM expenses as e 
        group by date(e.created)
    ) as ex
    ON date(t1.created) = date(ex.created)
    GROUP BY date(t1.created)) ORDER BY Date

输出:

Date        ReceiveAmount   ExpensesAmount  
2019-10-01  300             NULL
2019-11-01  200             NULL
2019-11-13  360             600

但是现在,如果我想从两个表中获取所有金额而不求和。我错过了一笔交易2019-11-13

(SELECT IFNULL(date(t1.created), date(ex.created)) as Date , t1.amount as ReceiveAmount,ex.amount as ExpensesAmount 
FROM transactions as t1
LEFT JOIN (
    SELECT e.amount as amount, created
       FROM expenses as e 
       group by date(e.created)
    ) as ex
ON date(ex.created) =  date(t1.created)
GROUP BY date(t1.created))

UNION

(SELECT IFNULL(date(t1.created), date(ex.created)) as Date, t1.amount as Receive,ex.amount as ExpensesAmount 
FROM transactions as t1

RIGHT JOIN (
    SELECT e.amount as amount, created
    FROM expenses as e 
    group by date(e.created)
) as ex
ON date(t1.created) = date(ex.created)
GROUP BY date(t1.created)) ORDER BY Date

输出:

2019-10-01  300     NULL
2019-11-01  200     NULL
2019-11-13  230     600

这里缺少一笔交易2019-11-13

预期结果 :

2019-10-01  300     NULL
2019-11-01  200     NULL
2019-11-13  230     600
2019-11-13  130     NULL

在这里,我如何得到我想要的结果?

专线小巴

如果您运行的是MySQL 8.0,则可以将row_number()s分配给每个带有created分区表的记录,然后执行以下命令left join

select t.created, t.amount, e.amount
from (
    select 
        t.*, 
        row_number() over(partition by created order by id)  rn 
    from transactions t
) t
left join (
    select
        e.*, 
        row_number() over(partition by created order by id)  rn 
    from expenses e
) e
    on e.created = t.created and e.rn = t.rn

如果两个表中的任何一个表中的日期都可能不存在于另一个表中,则它会有些复杂。基本上,我们需要模拟full joinMySQL中不存在的。这是一种处理方法union all

select created, max(t_amount) t_amount, max(e_amount) e_amount
from (
    select 
        created,
        amount t_amount,
        null e_amount,
        row_number() over(partition by created order by id)  rn 
    from transactions
    union all
    select 
        created,
        null,
        amount,
        row_number() over(partition by created order by id)
    from expenses
) d
group by created, rn

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

MySQL按一列分组,但选择所有数据

来自分类Dev

MySql 查询返回所有数据

来自分类Dev

我需要在MySQL上按行检索id的所有数据

来自分类Dev

MySQL查询不显示所有数据

来自分类Dev

仅显示按特定行分组的所有数据:从具有column ='value'的按列分组的表中选择*

来自分类Dev

总计-所有数据的分组依据

来自分类Dev

SQL Server:将所有数据按一列分组

来自分类Dev

使用分组依据按日期对所有数据进行排序

来自分类Dev

遍历对象数组以按日期对所有数据进行分组

来自分类Dev

MySQL查询按department_id分组的“departments LEFT JOIN products”不返回所有部门的数据

来自分类Dev

按字段分组的 MySQL 子查询

来自分类Dev

按查询分组,总和所有值

来自分类Dev

Mysql:按小时分组,如果没有数据,则为0

来自分类Dev

Mysql:按小时分组,如果没有数据,则为0

来自分类Dev

查询未返回所有数据

来自分类Dev

SQL查询按日期范围查找介于两个日期之间的所有数据

来自分类Dev

使用PHP按类别显示来自Mysql数据库的所有数据

来自分类Dev

MySQL“丢失”所有数据(InnoBD)

来自分类Dev

没有子查询的最新数据分组

来自分类Dev

分组后获取用户的所有数据

来自分类Dev

使用WHERE子句时MySQL查询不会显示所有数据

来自分类Dev

MySQL子查询按特定字段分组和计数记录

来自分类Dev

如何按顺序显示所有数据?

来自分类Dev

R,按日期连接所有数据集

来自分类Dev

按行连接所有数据并删除数字

来自分类Dev

mysql中是否有一个查询,它将截断特定数据库中表的所有数据?

来自分类Dev

按查询分组而不返回所有值

来自分类Dev

CoreData查询最初在子对象上返回零休息-但退出后所有数据都存在

来自分类Dev

查询Google Analytcs帐户的所有数据

Related 相关文章

  1. 1

    MySQL按一列分组,但选择所有数据

  2. 2

    MySql 查询返回所有数据

  3. 3

    我需要在MySQL上按行检索id的所有数据

  4. 4

    MySQL查询不显示所有数据

  5. 5

    仅显示按特定行分组的所有数据:从具有column ='value'的按列分组的表中选择*

  6. 6

    总计-所有数据的分组依据

  7. 7

    SQL Server:将所有数据按一列分组

  8. 8

    使用分组依据按日期对所有数据进行排序

  9. 9

    遍历对象数组以按日期对所有数据进行分组

  10. 10

    MySQL查询按department_id分组的“departments LEFT JOIN products”不返回所有部门的数据

  11. 11

    按字段分组的 MySQL 子查询

  12. 12

    按查询分组,总和所有值

  13. 13

    Mysql:按小时分组,如果没有数据,则为0

  14. 14

    Mysql:按小时分组,如果没有数据,则为0

  15. 15

    查询未返回所有数据

  16. 16

    SQL查询按日期范围查找介于两个日期之间的所有数据

  17. 17

    使用PHP按类别显示来自Mysql数据库的所有数据

  18. 18

    MySQL“丢失”所有数据(InnoBD)

  19. 19

    没有子查询的最新数据分组

  20. 20

    分组后获取用户的所有数据

  21. 21

    使用WHERE子句时MySQL查询不会显示所有数据

  22. 22

    MySQL子查询按特定字段分组和计数记录

  23. 23

    如何按顺序显示所有数据?

  24. 24

    R,按日期连接所有数据集

  25. 25

    按行连接所有数据并删除数字

  26. 26

    mysql中是否有一个查询,它将截断特定数据库中表的所有数据?

  27. 27

    按查询分组而不返回所有值

  28. 28

    CoreData查询最初在子对象上返回零休息-但退出后所有数据都存在

  29. 29

    查询Google Analytcs帐户的所有数据

热门标签

归档