MySQL:何时使用案例对共享和不共享的值求和/平均值?

标签 mysql sql

我有一个查询想要扩展,但遇到了障碍。我想要做的是返回包含围绕共享和非共享属性提供的数据的计数、总和和平均值的行。

我已经非常接近了,但是在我需要查看数据的地方返回了 null 和 0。

让我解释一下...但如果我需要澄清,请告诉我。

首先这是我的 table :

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 Fiddle:

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)                    |
+--------+------------------+------------------+------------------------+---------------------------+

相反,将显示未与“Orange”共享的属性总量以及未与“Orange”共享的属性的提交总数

我在 Mac Yosemite 上运行 mysql 5.6。

理想情况下,我希望在没有子选择的情况下实现此目的,但如果需要它并且没有选项,那么我想了解更多相关信息。

最佳答案

我认为这里的连接逻辑有一个小问题,您想要对水果之间的链接求和,但您的查询确保您始终将橙子连接到橙子,因此永远不会有不存在的属性分享:

ON ft.fruit_attribute = ft1.fruit_attribute 和 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;    

关于MySQL:何时使用案例对共享和不共享的值求和/平均值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33474157/

相关文章:

sql - 统计表中特定列的重复记录

mysql - jsp删除记录失败显示错误信息

mysql - 为什么在从最新的 MySQL 降级到 MySQL 5.0.88 时,使用 LIMIT 不再起作用?

mysql - 在 SQL 中出现错误 "No matching Unique or Primary key for the Column List"

mysql - 仅当父级存在时才加入父级名称

mysql - SQL 数据库 : use one table with 3, 5M 条目或条目较少的许多表?

php - 安全地存储数据

mysql - centos中mariadb远程连接失败

mysql - 有一种方法可以在 MySQL 中对不同表的信息进行索引

PHP/Mysql : A db entry needs to store multiple values for categorization (cat, 子目录、标签)