在MySQL中使用百分比创建动态数据透视表

时间:2019-07-05 15:06:38

标签: mysql

我正在使用mySQL。我有一个表(“要约”),其中有许多行。每行都与特定日期/时间的要约相关。每个报价都会交给一个人,该人会接受或拒绝该报价。样本数据:

    offer_time              person      status
    2014-12-12 00:00:00     Bob         accepted
    2014-11-12 00:00:00     Jim         accepted
    2014-11-12 00:00:00     Bob         accepted
    2014-12-12 00:00:00     Jim         declined
    2014-11-12 00:00:00     Jim         declined
    2014-12-12 00:00:00     Bob         accepted
    2014-11-13 00:00:00     Jim         declined
    2014-12-13 00:00:00     Bob         accepted
    2014-11-13 00:00:00     Bob         accepted
    2015-11-13 00:00:00     Bob         declined

我想对此进行调整,以便每个人(完整数据集中会有更多人,而且他们的姓名会随着时间而变化),我创建了一个列,显示他们随时间(按月/年)。这些数据将用于绘图。

到目前为止,我有:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'count(case when consultant = ''' ,
      consultant,
      ''' then 1 end) AS ',
      replace(consultant, ' ', '')
    )
    ) INTO @sql
FROM offers;

SET @sql = CONCAT('SELECT MONTH(offer_time) as month, YEAR(offer_time) as year, ', @sql, ' from offers
group by MONTH(offer_time),YEAR(offer_time)');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

这按月/年给出了每个人的报价总数:

month   year    Jim     Bob
12      2014    1       3
11      2014    3       2
11      2015    0       1

除了计算每个人的总行数(报价)之外,我想计算每个被接受的人在总报价中所占的百分比。我无法解决这个问题!谢谢。

编辑:

上面示例数据的输出应类似于:

month   year    Jim     Bob
12      2014    0       100
11      2014    33.33   100
11      2015    NA      0

(NA来自2015年对Jim的报价)。

EDIT2:

我可以使用静态枢轴执行以下操作:

SELECT
    MONTH(offer_time),
    YEAR (offer_time),
    COUNT(IF(person= 'Bob' AND status='accepted', 1, NULL)) / COUNT(IF(person= 'Bob', 1, NULL)) * 100 AS Bob,
    COUNT(IF(person = 'Jim' AND status='accepted', 1, NULL)) / COUNT(IF(person= 'Jim', 1, NULL)) * 100 AS Jim
FROM
    offers
GROUP BY
    MONTH(offer_time), YEAR(offer_time)

我现在只需要弄清楚如何使其动态化。

1 个答案:

答案 0 :(得分:0)

好的-我想我想出了一个动态解决方案:

rdtsc