2016-10-05 41 views
4

所以,这里是我的表:Mysql的具体计算行属性

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. 我如何选择再算上在A和B已经逛过所有的人,然后
  2. A和B ONLY?
  3. A或B但别无其他?
  4. D ONLY?

在我的例子预期的结果是:(1)约翰+帕梅拉,(2)约翰,(3)约翰(4)尼克

回答

3

的人在A处乙购物名称(和可能在别处):

的具有甲 乙人
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  -- B is present 

名称(但不包括其他):

SELECT name 
FROM yourTable 
GROUP BY name 
HAVING (SUM(CASE WHEN Store = 'A' THEN 1 END) > 0 OR   -- A is present 
     SUM(CASE WHEN Store = 'B' THEN 1 END) > 0) AND   -- B is present 
     SUM(CASE WHEN Store NOT IN ('A', 'B') THEN 1 END) = 0 -- only A or B 
人谁在一个逛过 和B个

名称:

SELECT name 
FROM yourTable 
GROUP BY name 
HAVING SUM(CASE WHEN Store <> 'D' THEN 1 END) = 0  -- only store D 

演示了第二个查询这里:

的谁只在商店d逛过人
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 

名称

SQLFiddle

+0

伟大的答案蒂姆和戈登。对于新案例(3)A或B而不是其他? – SamanthaAlexandria

+0

我已更新我的问题以涵盖更多案例。那么只有在D? – SamanthaAlexandria

+0

我再次更新了我的答案。 –

2

我喜欢接近他们使用group byhavingË查询:

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;