我们有一个订单簿和发票系统,我的任务是尝试从这些表格中输出月度滚动总计。
但我真的不知道从哪里开始。我认为有些 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/