0

有一个包含两列的表,carriernetworktype想选择运营商、网络类型以及恰好具有 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 类型。或中国移动没有但没有WIFI。

我认为我在有子句的正确轨道上,我想只用一个查询来解决这个问题,没有子查询。谢谢!

4

1 回答 1

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

内部“预查询”会为每个运营商获取您感兴趣的匹配数量,但此外,对于给定运营商,ALL 也很重要。然后,通过查找 sum() 和 count() = 2 的位置将它们删除。

于 2013-10-08T02:58:42.830 回答