Mysql使用特定属性计算行数
这是我的桌子:Mysql使用特定属性计算行数,mysql,select,count,distinct,Mysql,Select,Count,Distinct,这是我的桌子: Id | name | Store 001 | John | A 001 | John | A 001 | John | A 001 | John | B 001 | John | B 001 | John | D 002 | Bob | B 002 | Bob | C 003 | Dave | C 004 | Pamela | A 004 | Pamela | B 004 | Pamela | C 005 | Nick |
Id | name | Store
001 | John | A
001 | John | A
001 | John | A
001 | John | B
001 | John | B
001 | John | D
002 | Bob | B
002 | Bob | C
003 | Dave | C
004 | Pamela | A
004 | Pamela | B
004 | Pamela | C
005 | Nick | D
005 | Nick | D
005 | Nick | D
在我的例子中,预期结果是:(1)John+Pamela,(2)John,(3)John(4)Nick在A和B(可能在其他地方)购物的人的姓名: 在A或B(但无其他)具有以下特征的人员姓名: 仅在A和B购物的人员姓名:
SELECT name
FROM yourTable
GROUP BY name
HAVING SUM(CASE WHEN Store = 'A' THEN 1 END) > 0 AND -- A is present
SUM(CASE WHEN Store = 'B' THEN 1 END) > 0 AND -- B is present
COUNT(DISTINCT Store) = 2 -- only A and B are present
仅在D店购物的人员姓名:
SELECT name
FROM yourTable
GROUP BY name
HAVING SUM(CASE WHEN Store <> 'D' THEN 1 END) = 0 -- only store D
选择名称
从你的桌子上
按名称分组
具有总和(当存储“D”然后为1结束时的情况)=0——仅存储D
此处演示第二次查询:
我喜欢使用
分组方式和拥有方式来处理这些查询:
select name
from t
group by name
having sum(store = 'A') > 0 and
sum(store = 'B') > 0;
这让在两家商店都购物过的人受益匪浅。如果您只想要这两家商店,而不想要其他商店:
select name
from t
group by name
having sum(store = 'A') > 0 and
sum(store = 'B') > 0 and
sum(store not in ('A', 'B')) = 0;
蒂姆和戈登回答得很好。对于一个新的案例(3)a或B,但没有其他案例如何?我已经更新了我的问题,以涵盖更多的案例。只在D点怎么样?
select name
from t
group by name
having sum(store = 'A') > 0 and
sum(store = 'B') > 0;
select name
from t
group by name
having sum(store = 'A') > 0 and
sum(store = 'B') > 0 and
sum(store not in ('A', 'B')) = 0;