我在 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
我不想计算每个人的总行数(offer),而是想计算每个人被接受的 offer 总数的百分比。我无法解决这个问题!谢谢。
biên tập:
上面示例数据的输出应该类似于:
month year Jim Bob
12 2014 0 100
11 2014 33.33 100
11 2015 NA 0
(NA 来自于 2015 年没有对 Jim 的报价)。
Chỉnh sửa 2:
我可以按如下方式使用静态枢轴执行此操作:
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)
我现在需要弄清楚如何让它动态化。
好的 - 我想我已经想出了一个动态的解决方案:
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(' COUNT(IF(person= ''',
person,
''' AND status = "accepted", offer_time, NULL)) / COUNT(IF(person= ''',
person,
''', offer_time, NULL)) * 100 AS ',
person
)
) 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;
Tôi là một lập trình viên xuất sắc, rất giỏi!