我正在尝试使用 Google Charts API 从 MySQL 提取数据来构建堆积柱形图。 有 2 个值:销售额和报价。销售人员从开始/结束日期计算持续时间,并将该值除以持续时间得出每月数字。 报价的作用相同,但该值乘以将其降低的概率。 在表中,销售的状态为“工作订单”,报价的状态为“报价”。
我已经使用以下 MySQL 查询为报价单数据系列做好了一切工作:
WITH RECURSIVE dates(date) AS (
SELECT CONCAT(LEFT(CURRENT_DATE, 7), '-01') AS date
UNION ALL
SELECT DATE_ADD(date, INTERVAL 1 MONTH)
FROM dates
WHERE date < DATE_ADD(current_date(), INTERVAL 12 MONTH)
)
SELECT
sum(projects.sellValue * projects_meta.probability / PERIOD_DIFF(EXTRACT(YEAR_MONTH FROM tentativeFinish), EXTRACT(YEAR_MONTH FROM tentativeStart))) AS quotesM,
projects.status,
dates.date
FROM projects_meta LEFT JOIN projects ON projects.projectNo = projects_meta.PID
CROSS JOIN dates
WHERE dates.date >= tentativeStart AND dates.date < tentativeFinish AND projects.status IN ('Quote') GROUP BY dates.date;
我现在正在尝试将此图表与另一个销售系列叠加。 我尝试过这个,但我很难了解如何分离 IN 或 WHERE 条件,因为结果是将报价和工作订单的全部值堆叠在报价 * 概率系列之上,因为
projects.status IN ('Work Order','Quote')
。
WITH RECURSIVE dates(date) AS (
SELECT CONCAT(LEFT(CURRENT_DATE, 7), '-01') AS date
UNION ALL
SELECT DATE_ADD(date, INTERVAL 1 MONTH)
FROM dates
WHERE date < DATE_ADD(current_date(), INTERVAL 12 MONTH)
)
SELECT
sum(projects.sellValue * projects_meta.probability / PERIOD_DIFF(EXTRACT(YEAR_MONTH FROM tentativeFinish), EXTRACT(YEAR_MONTH FROM tentativeStart))) AS quotesM,
sum(projects.sellValue / PERIOD_DIFF(EXTRACT(YEAR_MONTH FROM tentativeFinish), EXTRACT(YEAR_MONTH FROM tentativeStart))) AS salesM,
projects.status,
dates.date
FROM projects_meta LEFT JOIN projects ON projects.projectNo = projects_meta.PID
CROSS JOIN dates
WHERE dates.date >= tentativeStart AND dates.date < tentativeFinish AND projects.status IN ('Work Order','Quote') GROUP BY dates.date;
所以我想做的只是将状态为工作订单的所有值相加,然后将状态为报价的所有(值 * 概率)相加。
我尝试过使用 UNION,但我认为由于 CROSS JOIN 与递归日期的关系,我遇到了困难。
我应该有一种方法可以运行 2 个单独的查询并在 PHP 中将它们连接起来,但我确信有一种方法可以在数据库查询中执行此操作,但我不确定如何操作,并且非常感谢关于在哪里的一些指导我需要寻找。
我终于找到了一种在 SUM 中使用 CASE 来解决这个问题的方法,如下所示:
SELECT
SUM(CASE WHEN projects.status='Quote' THEN projects.sellValue * projects_meta.probability / PERIOD_DIFF(EXTRACT(YEAR_MONTH FROM tentativeFinish), EXTRACT(YEAR_MONTH FROM tentativeStart)) ELSE 0 END) as quotesM,
SUM(CASE WHEN projects.status='Work ORder' THEN projects.sellValue / PERIOD_DIFF(EXTRACT(YEAR_MONTH FROM tentativeFinish), EXTRACT(YEAR_MONTH FROM tentativeStart)) ELSE 0 END) as salesM,
现在图表如下所示: