MySQL:使用何时总和/平均值共享和不共享?
问题描述:
我有一个查询我正在尝试扩展并遇到了障碍。我想要做的是返回包含计数,总计和平均值的数据,这些数据是围绕共享但不共享的属性提供的。MySQL:使用何时总和/平均值共享和不共享?
我有它非常接近,但返回NULL和0的地方,我需要看到的数据。
让我解释一下......但请让我知道是否需要澄清。
首先这里是我的表:
CREATE TABLE `fruits` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`fruit` varchar(11) DEFAULT NULL,
`fruit_attribute` varchar(11) DEFAULT '',
`submissions` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;
INSERT INTO `fruits` (`id`, `fruit`, `fruit_attribute`, `submissions`)
VALUES
(1,'Orange','tough peel',59),
(2,'Lemon','tough peel',70),
(3,'Orange','citrus',100),
(4,'Orange','juice',90),
(5,'Lemon','juice',75),
(6,'Lemon','tart',35),
(7,'Lemon','citurs',65),
(8,'Orange','breakfast',110),
(9,'Lemon','lemonaid',120),
(10,'Orange','florida',50);
接下来,我的查询:
SELECT ft.fruit,
COUNT(distinct ft1.fruit_attribute) As att_shared_lemon,
SUM(CASE WHEN ft1.fruit_attribute IS NULL THEN 1 ELSE 0 END) As not_shared_lemon,
SUM(CASE WHEN ft1.fruit_attribute IS NOT NULL THEN ft.submissions END) as sum_shared_submissions,
SUM(CASE WHEN ft1.fruit_attribute IS NULL THEN ft.submissions END) as sum_notshared_submissions
FROM fruits ft LEFT JOIN
fruits ft1
ON ft.fruit_attribute = ft1.fruit_attribute and ft1.fruit = 'Orange'
GROUP BY ft.fruit
having fruit='Orange'
ORDER BY att_shared_lemon desc;
这里是上面的SQL小提琴:
http://sqlfiddle.com/#!9/86e863/12
所需的输出会不包括下面的0和Null值:
+--------+------------------+------------------+------------------------+---------------------------+
| fruit | attr_shared_orange | attr_not_shared_orange| sum_shared_submissions | sum_notshared_submissions |
+--------+------------------+------------------+------------------------+---------------------------+
| Orange | 5 | 0 | 409 | (null) |
+--------+------------------+------------------+------------------------+---------------------------+
取而代之的将是没有被“橙色”和提交的不共享的属性和共享属性的总量“橙”
我在Mac上的优胜美地运行MySQL 5.6 。
理想情况下,我想实现这个没有子选择,但如果它是必需的,没有选择,那么我想更多地了解这一点。
答
我觉得有一个小问题与您携手逻辑在这里,你要总结成果之间的联系,但查询可确保你总是加入橙子和橘子,因此永远不会有属性,其不共享:
ON ft.fruit_attribute = ft1.fruit_attribute and ft1.fruit = 'Orange'
尝试此查询,而不是:
SELECT ft.fruit,
COUNT(distinct ft1.fruit_attribute) As att_shared_lemon,
SUM(CASE WHEN ft1.fruit_attribute IS NULL THEN 1 ELSE 0 END) As not_shared_lemon,
SUM(CASE WHEN ft1.fruit_attribute IS NOT NULL THEN ft.submissions END) as sum_shared_submissions,
SUM(CASE WHEN ft1.fruit_attribute IS NULL THEN ft.submissions END) as sum_notshared_submissions
FROM fruits ft
LEFT JOIN fruits ft1
ON ft.fruit_attribute = ft1.fruit_attribute and ft.fruit = 'Orange'
AND ft1.fruit != ft.fruit
WHERE ft.fruit='Orange'
GROUP BY ft.fruit
ORDER BY att_shared_lemon desc;
+1
太棒了..谢谢!! – lcm
的HAVAING子句旨在用于聚合函数的条件。改为在WHERE子句中放置水果='橙色'。 – jarlh