Това, с което трябва да работите, е дали гаранцията все още е валидна или е изтекла и датата на гаранцията, така че първо трябва да създадете таблица, която отразява това:
select product
, IF( warranty >= NOW(), 1, 0 ) as valid
, IF( warranty < NOW(), 1, 0 ) as expired
, warranty as last
from (
select product
, ADDDATE( purchased, INTERVAL 5 YEAR ) as warranty
from productWarranty
) w
group by product
;
Това ще ви донесе нещо подобно:
+---------+-------+---------+---------------------+
| product | valid | expired | warranty |
+---------+-------+---------+---------------------+
| Hammer | 1 | 0 | 2017-01-01 00:00:00 |
| Nipper | 1 | 0 | 2017-01-01 00:00:00 |
| Nipper | 1 | 0 | 2017-01-01 00:00:00 |
| Nipper | 1 | 0 | 2017-01-01 00:00:00 |
| Saw | 1 | 0 | 2017-01-01 00:00:00 |
| Saw | 0 | 1 | 2011-01-01 00:00:00 |
| Saw | 1 | 0 | 2017-01-01 00:00:00 |
| Saw | 1 | 0 | 2017-01-01 00:00:00 |
+---------+-------+---------+---------------------+
След това използвайте агрегатни функции, за да филтрирате и обобщите информацията, която търсите:
select product
, SUM( IF( warranty >= NOW(), 1, 0 ) ) as valid
, SUM( IF( warranty < NOW(), 1, 0 ) ) as expired
, MAX( warranty ) as last
from (
select product
, adddate( purchased, interval 5 year ) as warranty
from productWarranty
) w
group by product
;
+---------+-------+---------+---------------------+
| product | valid | expired | last |
+---------+-------+---------+---------------------+
| Hammer | 1 | 0 | 2017-01-01 00:00:00 |
| Nipper | 3 | 0 | 2017-01-01 00:00:00 |
| Saw | 3 | 1 | 2017-01-01 00:00:00 |
+---------+-------+---------+---------------------+