【发布时间】:2020-03-05 11:53:27
【问题描述】:
我在 MySQL 中设置了一个查询,以返回带有月份作为列标题和培训师名称作为行标题的结果。我正在尝试按月确定培训师的 NPS 分数。当我运行查询时,它只显示他们有调查结果的上个月的结果。如何修复查询以显示他们每个月的调查结果?
基本表结构:
CREATE TABLE nh_survey (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
trainer TINYINT(1),
trainer_nps TINYINT(1),
class_Date DATE
);
INSERT INTO nh_survey
(trainer,trainer_nps,class_Date)
VALUES
('''1''',' ''10''',' ''2019-10-21'''),
('''1''',' ''10''',' ''2019-10-21'''),
('''1''',' ''10''',' ''2019-10-21'''),
('''1''',' ''10''',' ''2019-10-21'''),
('''1''',' ''10''',' ''2019-10-25'''),
('''1''',' ''10''',' ''2019-10-21'''),
('''1''',' ''10''',' ''2019-10-21'''),
('''3''',' ''10''',' ''2019-10-14'''),
('''3''',' ''10''',' ''2019-10-14'''),
('''3''',' ''10''',' ''2019-10-14'''),
('''3''',' ''10''',' ''2019-10-14'''),
('''3''',' ''10''',' ''2019-10-14'''),
('''15''',' ''10''',' ''2019-10-07'''),
('''15''',' ''10''',' ''2019-10-07'''),
('''15''',' ''10''',' ''2019-10-07'''),
('''15''',' ''10''',' ''2019-10-07'''),
('''15''',' ''10''',' ''2019-10-07'''),
('''15''',' ''7''',' ''2019-10-07'''),
('''16''',' ''10''',' ''2019-10-07'''),
('''15''',' ''10''',' ''2019-10-07'''),
('''15''',' ''10''',' ''2019-10-07'''),
('''15''',' ''9''',' ''2019-10-07'''),
('''15''',' ''10''',' ''2019-10-07'''),
('''15''',' ''10''',' ''2019-10-07'''),
('''15''',' ''10''',' ''2019-10-07'''),
('''19''',' ''10''',' ''2019-09-30'''),
('''19''',' ''10''',' ''2019-09-30'''),
('''19''',' ''10''',' ''2019-09-30'''),
('''19''',' ''10''',' ''2019-09-30'''),
('''19''',' ''10''',' ''2019-09-30'''),
('''19''',' ''10''',' ''2019-09-30'''),
('''19''',' ''10''',' ''2019-09-30'''),
('''19''',' ''10''',' ''2019-09-30'''),
('''19''',' ''10''',' ''2019-10-04'''),
('''19''',' ''10''',' ''2019-09-30'''),
('''19''',' ''10''',' ''2019-09-30'''),
('''20''',' ''10''',' ''2019-09-23'''),
('''20''',' ''10''',' ''2019-09-23'''),
('''20''',' ''8''',' ''2019-09-23'''),
('''20''',' ''10''',' ''2019-09-23'''),
('''20''',' ''10''',' ''2019-09-23'''),
('''20''',' ''10''',' ''2019-09-23'''),
('''20''',' ''6''',' ''2019-09-23'''),
('''20''',' ''10''',' ''2019-09-23'''),
('''15''',' ''10''',' ''2019-09-26'''),
('''15''',' ''10''',' ''2019-08-16'''),
('''21''',' ''10''',' ''2019-09-16'''),
('''21''',' ''10''',' ''2019-09-16'''),
('''21''',' ''10''',' ''2019-09-20'''),
('''21''',' ''10''',' ''1992-10-07'''),
('''21''',' ''10''',' ''2019-09-16'''),
('''21''',' ''10''',' ''2019-09-16'''),
('''21''',' ''10''',' ''2019-09-16'''),
('''21''',' ''10''',' ''2019-09-16'''),
('''21''',' ''10''',' ''2019-09-16'''),
('''21''',' ''10''',' ''2019-09-16'''),
('''21''',' ''10''',' ''2019-09-16'''),
('''21''',' ''10''',' ''2019-09-16'''),
('''21''',' ''10''',' ''2019-09-20'''),
('''19''',' ''10''',' ''2019-09-09'''),
('''19''',' ''10''',' ''2019-09-09'''),
('''19''',' ''10''',' ''2019-09-09'''),
('''19''',' ''10''',' ''2019-09-10'''),
('''19''',' ''10''',' ''2019-09-09'''),
('''19''',' ''10''',' ''2019-09-09'''),
('''19''',' ''10''',' ''2019-09-09'''),
('''19''',' ''10''',' ''2019-09-09'''),
('''19''',' ''10''',' ''2019-09-09'''),
('''19''',' ''10''',' ''2019-09-09'''),
('''19''',' ''10''',' ''2019-09-09'''),
('''19''',' ''10''',' ''2019-09-09'''),
('''20''',' ''10''',' ''2019-09-03'''),
('''20''',' ''10''',' ''2019-09-03'''),
('''20''',' ''10''',' ''2019-09-03'''),
('''20''',' ''10''',' ''2019-09-03'''),
('''20''',' ''10''',' ''2019-09-03'''),
('''20''',' ''10''',' ''2019-09-03'''),
('''20''',' ''10''',' ''2019-09-03'''),
('''20''',' ''10''',' ''2019-09-03'''),
('''16''',' ''10''',' ''2019-08-19'''),
('''20''',' ''10''',' ''2019-08-26'''),
('''20''',' ''10''',' ''2019-08-26'''),
('''20''',' ''10''',' ''2019-08-26'''),
('''20''',' ''10''',' ''2019-08-26'''),
('''20''',' ''10''',' ''2019-08-26'''),
('''20''',' ''10''',' ''2019-08-26'''),
('''15''',' ''10''',' ''2019-07-22'''),
('''16''',' ''10''',' ''2019-08-19'''),
('''15''',' ''8''',' ''2019-08-23'''),
('''16''',' ''10''',' ''2019-08-19'''),
('''15''',' ''10''',' ''2019-08-19'''),
('''15''',' ''10''',' ''2019-08-19'''),
('''15''',' ''10''',' ''2019-08-19'''),
('''15''',' ''10''',' ''2019-08-19'''),
('''15''',' ''10''',' ''2019-08-19'''),
('''15''',' ''10''',' ''2019-08-19'''),
('''15''',' ''10''',' ''2019-08-19'''),
('''15''',' ''10''',' ''2019-08-19'''),
('''1''',' ''10''',' ''2019-08-05'''),
('''1''',' ''10''',' ''2019-08-05''');
CREATE TABLE trainers (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
revname VARCHAR(255)
);
INSERT INTO trainers
(id,revname)
VALUES
(1,'Trainer 1'),
(2,'Trainer 2'),
(3,'Trainer 3'),
(4,'Trainer 4'),
(6,'Trainer 5'),
(7,'Trainer 6'),
(8,'Trainer 7'),
(9,'Trainer 8'),
(10,'Trainer 9'),
(11,'Trainer 10'),
(12,'Trainer 11'),
(13,'Trainer 12'),
(15,'Trainer 13'),
(16,'Trainer 14'),
(18,'Trainer 15'),
(19,'Trainer 16'),
(20,'Trainer 17'),
(21,'Trainer 18'),
(22,'Trainer 19'),
(23,'Trainer 20'),
(24,'Trainer 21');
这是查询:
select t1.revname AS 'Trainer',
IF( MONTH( t2.class_date) =12, round(sum(t2.npscore)/count(t2.npscore)*100, 1 ),0) AS 'Dec',
IF( MONTH( t2.class_date) =1, round(sum(t2.npscore)/count(t2.npscore)*100, 1 ),0) AS 'Jan',
IF( MONTH( t2.class_date) =2, round(sum(t2.npscore)/count(t2.npscore)*100, 1 ),0) AS 'Feb',
IF( MONTH( t2.class_date) =3, round(sum(t2.npscore)/count(t2.npscore)*100, 1 ),0) AS 'Mar',
IF( MONTH( t2.class_date) =4, round(sum(t2.npscore)/count(t2.npscore)*100, 1 ),0) AS 'Apr',
IF( MONTH( t2.class_date) =5, round(sum(t2.npscore)/count(t2.npscore)*100, 1 ),0) AS 'May',
IF( MONTH( t2.class_date) =6, round(sum(t2.npscore)/count(t2.npscore)*100, 1 ),0) AS 'Jun',
IF( MONTH( t2.class_date) =7, round(sum(t2.npscore)/count(t2.npscore)*100, 1 ),0) AS 'Jul',
IF( MONTH( t2.class_date) =8, round(sum(t2.npscore)/count(t2.npscore)*100, 1 ),0) AS 'Aug',
IF( MONTH( t2.class_date) =9, round(sum(t2.npscore)/count(t2.npscore)*100, 1 ),0) AS 'Sep',
IF( MONTH( t2.class_date) =10, round(sum(t2.npscore)/count(t2.npscore)*100, 1 ),0) AS 'Oct',
IF( MONTH( t2.class_date) =11, round(sum(t2.npscore)/count(t2.npscore)*100, 1 ),0) AS 'Nov'
from
(select id, revname
from trainers
where id in(1,2,3,15,16,18,19,20,21)) t1
LEFT JOIN
(SELECT
trainer,
class_date,
CASE
WHEN trainer_nps IN (9 , 10) THEN 1
WHEN trainer_nps IN (7 , 8) THEN 0
ELSE - 1
END AS npscore
FROM
nh_survey
Where class_date between '2018-01-28' and '2019-11-30') t2 on t1.id = t2.trainer
group by t1.revname
order by t1.id ASC
如果我只按培训师分组,它只会给出培训师有调查结果的最后一个月。如果我将 class_date 添加到分组中,它会为每个培训师提供 12 行。
【问题讨论】:
-
已编辑以包含表格