如何在一个星期的一周中拆分记录

时间:2017-03-20 10:18:04

标签: mysql

CREATE TABLE `employee` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  `doj` varchar(50) DEFAULT NULL,
  `salary` int(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1;

这是我的员工表查询

INSERT INTO `test`.`employee` (`id`, `name`, `doj`, `salary`) VALUES ('1', 'A', ' 2017-01-01', '100');
INSERT INTO `test`.`employee` (`id`, `name`, `doj`, `salary`) VALUES ('2', 'V', '2017-01-09 ', '1000000');
INSERT INTO `test`.`employee` (`id`, `name`, `doj`, `salary`) VALUES ('3', 'C', '2017-01-22', '1000000');
INSERT INTO `test`.`employee` (`id`, `name`, `doj`, `salary`) VALUES ('4', 'f', '2017-01-30', '212321');
INSERT INTO `test`.`employee` (`id`, `name`, `doj`, `salary`) VALUES ('5', 'A', ' 2017-01-02', '123213213');

我必须在一个月的每周明智报告中拆分记录。当我通过一个月的startDate和endDate时。

SELECT 
    DATE_FORMAT(doj, '%X-%V') AS date,
    COUNT(doj) AS total
FROM
    employee
WHERE
    DATE(doj) BETWEEN CAST('2017-01-01' AS DATE) AND CAST('2017-01-31' AS DATE)
GROUP BY date
ORDER BY date

使用给定的查询我尝试每周明智地找到1月记录,所以得到像这样的输出是正确的

date      total

'2017-01', '2'
'2017-02', '1'
'2017-04', '1'
'2017-05', '1'

但是我想要那周的记录,其中count不是零计数。

预期产出:

date      total

'2017-01', '2'
'2017-02', '1'
'2017-03', '0'
'2017-04', '1'
'2017-05', '1'

但是我无法做到这一点请建议我如何获得记录,我可以从中获得零记录周计数。

1 个答案:

答案 0 :(得分:1)

在没有系列生成函数的数据库(如MySQL)中,我总是使用系列创建表。在这种情况下,创建一个这样的表:

create table dates(_date date primary key);
insert into dates values
('2016-01-01'),
('2016-01-02'),
 ...,
('2017-12-31'); // as many dates as you need, but see below

然后使用系列中的where子句连接到它:

SELECT 
    DATE_FORMAT(_date, '%X-%V') AS date,
    COUNT(doj) AS total
FROM dates
LEFT JOIN employee ON doj = _date
WHERE _date BETWEEN '2017-01-01 AND '2017-01-31'
GROUP BY date
ORDER BY date

这里可以轻松添加大量日期,适合闰年等:

create table dates(_date date);
insert into dates values ('2000-01-01'); // pick your start date
insert into dates select adddate(_date, (select count(*) from dates)) from dates;
insert into dates select adddate(_date, (select count(*) from dates)) from dates;
insert into dates select adddate(_date, (select count(*) from dates)) from dates;
// etc until you have enough data

每次运行insert命令时,行数都会增加一倍。如果你运行12次,那么你将有10年的约会。