2015-11-02 47 views
2

我有一个查询我正在尝试扩展并遇到了障碍。我想要做的是返回包含计数,总计和平均值的数据,这些数据是围绕共享但不共享的属性提供的。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 。

理想情况下,我想实现这个没有子选择,但如果它是必需的,没有选择,那么我想更多地了解这一点。

+0

的HAVAING子句旨在用于聚合函数的条件。改为在WHERE子句中放置水果='橙色'。 – jarlh

回答

2

我觉得有一个小问题与您携手逻辑在这里,你要总结成果之间的联系,但查询可确保你总是加入橙子和橘子,因此永远不会有属性,其共享:

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