Google 图表堆叠数据系列的多个位置

问题描述 投票:0回答:1

我正在尝试使用 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 中将它们连接起来,但我确信有一种方法可以在数据库查询中执行此操作,但我不确定如何操作,并且非常感谢关于在哪里的一些指导我需要寻找。

以下是当前带有底部查询的图表的显示方式: enter image description here

mysql
1个回答
0
投票

我终于找到了一种在 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,

现在图表如下所示:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.