如何在 MySQL 中添加带总和的平均值(情况...)?
How to add averages w/ sum (case when...) in MySQL?
我正在处理一个 SQL 查询,它几乎在我想要的位置。我只想为每个 "attributes_share_lemon" 和 "attribites_not_shared_lemon".
的平均提交添加两列
这是我正在处理的 SQL fiddle:
http://sqlfiddle.com/#!9/6ea5d8/8
这是创建和插入:
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`)
);
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 ft1.fruit, ft1.submissions,
SUM(CASE WHEN ft2.fruit_attribute IS NOT NULL THEN 1 ELSE 0 END) As attributes_shared_lemon,
SUM(CASE WHEN ft2.fruit_attribute IS NULL THEN 1 ELSE 0 END) As attributes_not_shared_lemon
FROM fruits ft1 LEFT JOIN
(
SELECT ft.fruit, ft.fruit_attribute, ft.submissions
FROM fruits ft
WHERE ft.fruit = 'Lemon'
) ft2
ON ft1.fruit_attribute = ft2.fruit_attribute
GROUP BY ft1.fruit;
当前输出
| fruit | submissions | attributes_shared_lemon | attributes_not_shared_lemon |
|--------|-------------|-------------------------|-----------------------------|
| Lemon | 70 | 5 | 0 |
| Orange | 59 | 2 | 3 |
您的查询看起来没问题。但是,你不需要子查询,所以一个更简单的版本是:
SELECT ft.fruit,
COUNT(ftl.fruit_attribute) As attributes_shared_lemon,
SUM(ftl.fruit_attribute IS NULL) As attributes_not_shared_lemon
FROM fruits ft LEFT JOIN
fruits ftl
ON ft.fruit_attribute = ftl.fruit_attribute and ftl.fruit = 'Lemon'
GROUP BY ft.fruit;
我删除了 submissions
列,因为它在每一行上都不是唯一的。
编辑:
如果您想要这些组的 submissions
列的平均值,请使用 case
:
SELECT ft.fruit,
AVG(CASE WHEN ftl.fruit_attribute IS NOT NULL THEN ft.submissions END) as avg_shared,
AVG(CASE WHEN ftl.fruit_attribute IS NULL THEN ft.submissions END) as avg_notshared,
COUNT(ftl.fruit_attribute) As attributes_shared_lemon,
SUM(ftl.fruit_attribute IS NULL) As attributes_not_shared_lemon
FROM fruits ft LEFT JOIN
fruits ftl
ON ft.fruit_attribute = ftl.fruit_attribute and ftl.fruit = 'Lemon'
GROUP BY ft.fruit;
目前还不清楚你的问题是什么。
只是我的猜测。可能你需要 SUM(ft1.submissions)
和COUNT(DISTINCT ft2.fruit_attribute)
以避免多次计算相同的属性。
和COUNT(DISTINCT ft1.fruit_attribute)-COUNT(DISTINCT ft2.fruit_attribute)
以确保您拥有正确的当前水果属性计数器。
http://sqlfiddle.com/#!9/6ea5d8/22
SELECT ft1.fruit, SUM(ft1.submissions),
COUNT(DISTINCT ft2.fruit_attribute) As attributes_shared_lemon,
COUNT(DISTINCT ft1.fruit_attribute)-COUNT(DISTINCT ft2.fruit_attribute) As attributes_not_shared_lemon
FROM fruits ft1
LEFT JOIN fruits ft2
ON ft1.fruit_attribute = ft2.fruit_attribute
AND ft2.fruit = 'Lemon'
GROUP BY ft1.fruit;
我正在处理一个 SQL 查询,它几乎在我想要的位置。我只想为每个 "attributes_share_lemon" 和 "attribites_not_shared_lemon".
的平均提交添加两列这是我正在处理的 SQL fiddle:
http://sqlfiddle.com/#!9/6ea5d8/8
这是创建和插入:
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`)
);
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 ft1.fruit, ft1.submissions,
SUM(CASE WHEN ft2.fruit_attribute IS NOT NULL THEN 1 ELSE 0 END) As attributes_shared_lemon,
SUM(CASE WHEN ft2.fruit_attribute IS NULL THEN 1 ELSE 0 END) As attributes_not_shared_lemon
FROM fruits ft1 LEFT JOIN
(
SELECT ft.fruit, ft.fruit_attribute, ft.submissions
FROM fruits ft
WHERE ft.fruit = 'Lemon'
) ft2
ON ft1.fruit_attribute = ft2.fruit_attribute
GROUP BY ft1.fruit;
当前输出
| fruit | submissions | attributes_shared_lemon | attributes_not_shared_lemon |
|--------|-------------|-------------------------|-----------------------------|
| Lemon | 70 | 5 | 0 |
| Orange | 59 | 2 | 3 |
您的查询看起来没问题。但是,你不需要子查询,所以一个更简单的版本是:
SELECT ft.fruit,
COUNT(ftl.fruit_attribute) As attributes_shared_lemon,
SUM(ftl.fruit_attribute IS NULL) As attributes_not_shared_lemon
FROM fruits ft LEFT JOIN
fruits ftl
ON ft.fruit_attribute = ftl.fruit_attribute and ftl.fruit = 'Lemon'
GROUP BY ft.fruit;
我删除了 submissions
列,因为它在每一行上都不是唯一的。
编辑:
如果您想要这些组的 submissions
列的平均值,请使用 case
:
SELECT ft.fruit,
AVG(CASE WHEN ftl.fruit_attribute IS NOT NULL THEN ft.submissions END) as avg_shared,
AVG(CASE WHEN ftl.fruit_attribute IS NULL THEN ft.submissions END) as avg_notshared,
COUNT(ftl.fruit_attribute) As attributes_shared_lemon,
SUM(ftl.fruit_attribute IS NULL) As attributes_not_shared_lemon
FROM fruits ft LEFT JOIN
fruits ftl
ON ft.fruit_attribute = ftl.fruit_attribute and ftl.fruit = 'Lemon'
GROUP BY ft.fruit;
目前还不清楚你的问题是什么。
只是我的猜测。可能你需要 SUM(ft1.submissions)
和COUNT(DISTINCT ft2.fruit_attribute)
以避免多次计算相同的属性。
和COUNT(DISTINCT ft1.fruit_attribute)-COUNT(DISTINCT ft2.fruit_attribute)
以确保您拥有正确的当前水果属性计数器。
http://sqlfiddle.com/#!9/6ea5d8/22
SELECT ft1.fruit, SUM(ft1.submissions),
COUNT(DISTINCT ft2.fruit_attribute) As attributes_shared_lemon,
COUNT(DISTINCT ft1.fruit_attribute)-COUNT(DISTINCT ft2.fruit_attribute) As attributes_not_shared_lemon
FROM fruits ft1
LEFT JOIN fruits ft2
ON ft1.fruit_attribute = ft2.fruit_attribute
AND ft2.fruit = 'Lemon'
GROUP BY ft1.fruit;