如何比较具有相同 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