我有以下格式的一组数据:
CAR_INVENTORY TABLE
CAR_ID MAKE_MODEL COLOR YEAR
1 Ford Fusion Black 2015
2 Tesla Model S White 2014
3 Acura ILX Blue 2013
4 Ford Fusion Black 2013
5 Toyota Corolla Blue 2014
6 Ford Fusion Blue 2013
7 Toyota Corolla Blue 2012
8 Acura ILX Black 2015
9 Ford Focus Blue 2012
10 Ford Fusion White 2013
11 Acura ILX Black 2012
12 Toyota Corolla Black 2015
13 Toyota Corolla Blue 2014
14 Ford Focus White 2015
15 Tesla Model S Red 2015
16 Acura TLX White 2014
17 Toyota Corolla Blue 2014
18 Ford Focus Black 2013
INVENTORY_LOG TABLE
LOG_ID CAR_ID NOTE
1 7 Issue with Fuel Guage
2 3 Sweet Ride
3 16 Zippy
4 14 Issue with transmission
5 3 Fun to Drive
6 2 *NULL*
7 8 *NULL*
8 10 Economic
9 15 WOW
10 9 Good Fuel Economy
11 16 Minor issue with Shifting
12 7 Issue with Airbag
13 17 Great Mileage
14 1 Nice Tech
15 13 *NULL*
16 11 Trunk is small
17 12 *NULL*
18 2 Very Speedy
19 7 Good Mileage
20 10 Roomy
21 4 *NULL*
22 6 Nice Tech Package
23 5 Good Economy
24 18 Cool
我知道这不是完全正常化。我们假设我不能搞乱数据。
car_inventory表中每辆车都有一排库存。 inventory_log表对于car_inventory中列出的每辆车至少有一个条目,因此每辆车可能有许多日志条目。 inventory_log中的条目可以为null。
我到目前为止
如果汽车有它的词“问题”日志完成,它需要进行标注。我已经想通的那部分:
SELECT
ci.car_id,
CONCAT(ci.color, " ", ci.make_model) as car,
SUM(IF (LOWER(il.note) LIKE '%issue%', TRUE, FALSE)) AS issue
FROM car_inventory ci
LEFT JOIN inventory_log il USING (car_id)
GROUP BY ci.car_id
ORDER BY ci.car_id;
这yealds:
car_id car issue
1 Black Ford Fusion 0
2 White Tesla Model S 0
3 Blue Acura ILX 0
4 Black Ford Fusion 0
5 Blue Toyota Corolla 0
6 Blue Ford Fusion 0
7 Blue Toyota Corolla 2
8 Black Acura ILX 0
9 Blue Ford Focus 0
10 White Ford Fusion 0
11 Black Acura ILX 0
12 Black Toyota Corolla 0
13 Blue Toyota Corolla 0
14 White Ford Focus 1
15 Red Tesla Model S 0
16 White Acura TLX 1
17 Blue Toyota Corolla 0
18 Black Ford Focus 0
这给非零结果与问题的任何汽车。
我需要做的下一件事是通过他们的颜色,超过一定的年份计数所有。假设我们只对黑色,白色和蓝色感兴趣,我们只有福特,讴歌,丰田和特斯拉(我知道我可以使用准备好的语句来实现这种动态)。明白了一个中袋过:
SELECT
CASE
WHEN ci.make_model LIKE "Acura%" THEN "Acura"
WHEN ci.make_model LIKE "Ford%" THEN "Ford"
WHEN ci.make_model LIKE "Toyota%" THEN "Toyota"
WHEN ci.make_model LIKE "Tesla%" THEN "Tesla"
END AS Make,
SUM(CASE WHEN ci.color = "Black" THEN 1 ELSE 0 END) as Black,
SUM(CASE WHEN ci.color = "Blue" THEN 1 ELSE 0 END) as Blue,
SUM(CASE WHEN ci.color = "White" THEN 1 ELSE 0 END) as White
FROM car_inventory ci
LEFT JOIN inventory_log il USING (car_id)
WHERE
ci.year > 2012
GROUP BY Make
ORDER BY Make;
这给了我:
Make Black Blue White
Acura 1 1 1
Ford 3 1 2
Tesla 0 0 1
Toyota 1 3 0
在做car_inventory表的快速计数,有14辆汽车于2012年更新的,那是黑色,蓝色或白色。
的问题
这里就是我有麻烦:
我试图做的是将二者结合起来。我需要根据颜色来计算所有颜色,哪里没有问题。
这里的结果集,我试图让:
DESIRED RESULT
MAKE Black Blue White
Acura 1 1 0
Ford 3 1 1
Tesla 0 0 1
Toyota 1 2 0
以下三个车中删除:
car_id car issues
7 Blue Toyota Corolla 2
14 White Ford Focus 1
16 White Acura TLX 1
我尝试添加AND SUM(IF (LOWER(il.note) LIKE '%issue%', TRUE, FALSE)) = 0
WHERE子句。这会导致mysql错误1111“组功能的无效使用”。我也试过HAVING SUM(IF (LOWER(il.note) LIKE '%issue%', TRUE, FALSE)) != 0
。它不正确的结果,只显示特斯拉和丰田的行。
问题
如何创建MySQL中的交叉表查询,使得汽车(从car_inventory)与在他们所说的“问题”的日志条目(来自inventory_log)不计?
将子查询移动到where子句似乎更快。谢谢。 – mcmurphy