如何比较具有相同 ID 但不同其他属性的值?
How to compare values with the same ID but different other attribute?
+------+------+------+
| ID |letter|number|
+------+------+------+
|1 |A | 23 |
+------+------+------+
|1 |B | 45 |
+------+------+------+
|2 |A | 37 |
+------+------+------+
|2 |B | 24 |
+------+------+------+
|2 |C | 26 |
+------+------+------+
|3 |A | 47 |
+------+------+------+
|3 |C | 35 |
+------+------+------+
这里是菜鸟
我想找出给定 ID 的数字在字母 A 时小于字母 B 时的所有实例。例如,当 ID 为 1 时,A 的数字为 23,而字母为 B 的数字为B 是 45。由于 23 < 45,它符合条件,我想 return ID 1 以及两个数字 (23 + 45) 的总和。 ID = 2 不起作用,因为 37 不小于 24。ID = 3 也不起作用,因为它没有带有字母 B 的条目。
在 having
子句中使用条件聚合:
select id, sum(number) number_total
from mytable
where letter in ('A', 'B')
group by id
having min(case when letter = 'A' then number end) < min(case when letter = 'B' then number end)
这假设 (id, letter)
个元组在 table 中是唯一的。否则你可能想要 SUM()
而不是 MIN()
.
如果您还想显示这些值,那么 MySQL 允许您在 having
子句中使用别名:
select
id,
sum(number) number_total,
min(case when letter = 'A' then number end) number_a,
min(case when letter = 'B' then number end) number_b
from mytable
where letter in ('A', 'B')
group by id
having number_a < number_b
+------+------+------+
| ID |letter|number|
+------+------+------+
|1 |A | 23 |
+------+------+------+
|1 |B | 45 |
+------+------+------+
|2 |A | 37 |
+------+------+------+
|2 |B | 24 |
+------+------+------+
|2 |C | 26 |
+------+------+------+
|3 |A | 47 |
+------+------+------+
|3 |C | 35 |
+------+------+------+
这里是菜鸟
我想找出给定 ID 的数字在字母 A 时小于字母 B 时的所有实例。例如,当 ID 为 1 时,A 的数字为 23,而字母为 B 的数字为B 是 45。由于 23 < 45,它符合条件,我想 return ID 1 以及两个数字 (23 + 45) 的总和。 ID = 2 不起作用,因为 37 不小于 24。ID = 3 也不起作用,因为它没有带有字母 B 的条目。
在 having
子句中使用条件聚合:
select id, sum(number) number_total
from mytable
where letter in ('A', 'B')
group by id
having min(case when letter = 'A' then number end) < min(case when letter = 'B' then number end)
这假设 (id, letter)
个元组在 table 中是唯一的。否则你可能想要 SUM()
而不是 MIN()
.
如果您还想显示这些值,那么 MySQL 允许您在 having
子句中使用别名:
select
id,
sum(number) number_total,
min(case when letter = 'A' then number end) number_a,
min(case when letter = 'B' then number end) number_b
from mytable
where letter in ('A', 'B')
group by id
having number_a < number_b