MySQL 从相关表中获取时间点总数

标签 mysql

我们有一个订单簿和发票系统,我的任务是尝试从这些表格中输出月度滚动总计。
但我真的不知道从哪里开始。我认为有些 SQL 语法我什至还不知道。我熟悉 INNER/LEFT/JOINS 和 GROUP BY 等,但按日期分组很困惑,因为我不知道如何将数据限制为当时分组的当前日期。我认为这将涉及将表连接到它们自己或可能是一个子选择。我一直认为除非绝对必要,否则最好避免子选择。

基本上系统有3张表
订单: order_id, currency, order_stamp
orders_lines: order_line_id, invoice_id, order_id, price
发票:invoice_id、invoice_stamp
order_stamp 和 invoice_stamp 是存储为整数的 UTC unix 时间戳,而不是 MySQL 时间戳。

我正在尝试按年/月获取列表,显示当时的当前未开票订单总数(价格总和)。
当前订单是order_stamp小于或等于当月1日00:00的订单。
未开票订单是指 invoice_stamp 为空或 invoice_stamp 大于当月 1 日 00:00 的订单。
那时可能还没有相关的发票,invoice_id 可能为空。

有人对我应该加入什么以及我需要根据什么进行分组有任何建议吗?

干杯,B

最佳答案

SELECT  yr, mon, COALESCE(SUM(price), 0)
FROM    (
        SELECT  2010 AS yr
        UNION ALL
        SELECT  2009
        UNION ALL
        …
        ) as years
CROSS JOIN
        (
        SELECT  1 AS mon
        UNION ALL
        SELECT  2
        …
        UNION ALL
        SELECT  12
        ) as months
LEFT JOIN
        orders o
ON      o.order_stamp <= UNIX_TIMESTAMP(CAST(CONCAT(year, mon, '01') AS DATE))
LEFT JOIN
        order_lines ol
ON      ol.order_id = o.order_id
        AND NOT EXISTS
        (
        SELECT  NULL
        FROM    invoice i
        WHERE   i.invoice_id = ol.invoice_id
                AND i.invoice_stamp > UNIX_TIMESTAMP(CAST(CONCAT(year, mon, '01') AS DATE))
        )
GROUP BY
        yr, mon

关于MySQL 从相关表中获取时间点总数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2464751/

相关文章:

mysql子查询错误无法识别。错误代码1064

mysql - CodeIgniter - 当第二个表中没有行时 MySQL 连接

php - 循环遍历mysql结果集占用大量内存,我该如何改进

mysql - 如何使用 join in magento 获取集合

php - MySQL - 按字符数排序

php - 有人可以推荐我可以添加到我的网站的 php mysql 评级系统吗

mysql - 在 mysql 中使用 SELECT 插入值

php - Mysql插入空数据的最佳方法是什么

php - Codeigniter Mysql 没有完成循环

mysql - 根据另一个表中的值获取所有值