MySQL:case-when查询优良中差


对于报表查询,就效率来讲,通常属于查询极慢的SQL语句,同时也是使用频率极低的语句,因为除了管理员,不会有太多人会去查询报表;

数据的处理交给Java代码处理,还是给数据库处理,并没有什么好争论的,直接看问题:

如图:根据random的值,按照日期统计出每日的优良中差各出现的次数

 

 

##建表语句

CREATE TABLE `cj` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `dat` date NOT NULL,
  `ran` smallint(4) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO `cj` (`id`, `dat`, `ran`) VALUES ('1', '2017-09-05', '1');
INSERT INTO `cj` (`id`, `dat`, `ran`) VALUES ('2', '2017-09-06', '3');
INSERT INTO `cj` (`id`, `dat`, `ran`) VALUES ('3', '2017-09-05', '3');
INSERT INTO `cj` (`id`, `dat`, `ran`) VALUES ('4', '2017-09-01', '2');
INSERT INTO `cj` (`id`, `dat`, `ran`) VALUES ('5', '2017-09-02', '3');
INSERT INTO `cj` (`id`, `dat`, `ran`) VALUES ('6', '2017-09-03', '4');
INSERT INTO `cj` (`id`, `dat`, `ran`) VALUES ('7', '2017-09-04', '5');
INSERT INTO `cj` (`id`, `dat`, `ran`) VALUES ('8', '2017-09-05', '1');
INSERT INTO `cj` (`id`, `dat`, `ran`) VALUES ('9', '2017-09-01', '3');
INSERT INTO `cj` (`id`, `dat`, `ran`) VALUES ('10', '2017-09-02', '4');
INSERT INTO `cj` (`id`, `dat`, `ran`) VALUES ('11', '2017-09-03', '5');
INSERT INTO `cj` (`id`, `dat`, `ran`) VALUES ('12', '2017-09-04', '1');
INSERT INTO `cj` (`id`, `dat`, `ran`) VALUES ('13', '2017-09-05', '2');
INSERT INTO `cj` (`id`, `dat`, `ran`) VALUES ('14', '2017-09-02', '3');
INSERT INTO `cj` (`id`, `dat`, `ran`) VALUES ('15', '2017-09-02', '3');
INSERT INTO `cj` (`id`, `dat`, `ran`) VALUES ('16', '2017-09-01', '4');
INSERT INTO `cj` (`id`, `dat`, `ran`) VALUES ('17', '2017-09-02', '5');
INSERT INTO `cj` (`id`, `dat`, `ran`) VALUES ('18', '2017-09-03', '1');
INSERT INTO `cj` (`id`, `dat`, `ran`) VALUES ('19', '2017-09-05', '3');
INSERT INTO `cj` (`id`, `dat`, `ran`) VALUES ('20', '2017-09-02', '4');
INSERT INTO `cj` (`id`, `dat`, `ran`) VALUES ('21', '2017-09-04', '5');
INSERT INTO `cj` (`id`, `dat`, `ran`) VALUES ('22', '2017-09-05', '3');
INSERT INTO `cj` (`id`, `dat`, `ran`) VALUES ('23', '2017-09-05', '1');
INSERT INTO `cj` (`id`, `dat`, `ran`) VALUES ('24', '2017-09-05', '2');
INSERT INTO `cj` (`id`, `dat`, `ran`) VALUES ('25', '2017-09-01', '3');
INSERT INTO `cj` (`id`, `dat`, `ran`) VALUES ('26', '2017-09-02', '4');
INSERT INTO `cj` (`id`, `dat`, `ran`) VALUES ('27', '2017-09-05', '3');

##查询语句

SELECT
    A.DAT,
    max(CASE WHEN A.ran = 1 THEN A.CON ELSE 0 END) '',
    max(CASE WHEN A.ran = 2 THEN A.CON ELSE 0 END) '较差',
    max(CASE WHEN A.ran = 3 THEN A.CON ELSE 0 END) '',
    max(CASE WHEN A.ran = 4 THEN A.CON ELSE 0 END) '',
    max(CASE WHEN A.ran = 5 THEN A.CON ELSE 0 END) ''
FROM (
    SELECT DATE(T.dat) dat,COUNT(1) CON,T.ran FROM cj T 
    WHERE T.dat > DATE(DATE_SUB(NOW(),INTERVAL 30 DAY))
    GROUP BY DATE(T.dat),T.ran
) A GROUP BY A.DAT

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM