拥有一个包含两列的表carrier
和networktype
我想选择具有2种特定网络类型且没有其他网络类型的运营商,网络类型和行数。所以给出下表
Carrier NetworkType Count
302720 WIFI_11B_G 2
31000 NONE 1
31000 WIFI_11B_G 72
ATT EDGE 4
ATT HSPA 757
ATT UMTS 98
ATT WIFI_11B_G 163,511
BELL HSPA 3
BELL LTE 16
BELL NONE 57
BELL WIFI_11B_G 5,866
CHINAMOBILE NONE 2
CHINAMOBILE WIFI_11B_G 37
它应该返回:
31000 NONE 1
31000 WIFI_11B_G 72
CHINAMOBILE NONE 2
CHINAMOBILE WIFI_11B_G 37
这是我正在运行的查询
SELECT carrier, network_type, count(*) FROM mytable
GROUP BY carrier, network_type
HAVING SUM(CASE
WHEN network_type = 'NONE' THEN 1
WHEN network_type = 'WIFI_11B_G' THEN 1
ELSE 2
END) = 2
AND network_type IN ('NONE', 'WIFI_11B_G')
但它只返回正好有2个计数的运营商!所以例如302720与WIFI_11B_G,因为它只有2个计数,但它没有NONE类型。或没有CHINAMOBILE但没有WIFI。
我认为我在使用having子句的正确轨道上,我想用一个查询解决这个问题,没有子查询。谢谢!
答案 0 :(得分:1)
你似乎要求两个特定的网络,但想要消除a)没有两者或b)有这两个和更多的人。我会接近
SELECT
mt2.Carrier,
mt2.NetworkType,
mt2.Count
from
( select carrier,
SUM(CASE WHEN network_type IN ( 'NONE', 'WIFI_11B_G')
THEN 1 else 0 end ) as NetworksIWant,
count(*) as AllNetworksForCarrier
from
myTable
group by
carrier ) PreQuery
JOIN myTable mt2
on PreQuery.carrier = mt2.carrier
AND mt2.network_type IN ( 'NONE', 'WIFI_11B_G')
where
PreQuery.NetworksIWant = 2
AND PreQuery.AllNetworksForCarrier = 2
内部的“PreQuery”为每个运营商提供了多少与您感兴趣的匹配,但此外,对于给定的运营商,还需要ALL。然后,通过查找sum()和count()= 2的位置删除它们。