SQL有两种类型,但不多

SQL有两种类型,但不多,sql,postgresql,having-clause,Sql,Postgresql,Having Clause,有一个包含两列的表,carrier和networktype,我想选择carrier、networktype和行数,这些行正好有两种特定的网络类型,没有其他类型。因此,给出下表 Carrier NetworkType Count 302720 WIFI_11B_G 2 31000 NONE 1 31000 WIFI_11B_G 72 ATT EDGE 4 ATT

有一个包含两列的表,
carrier
networktype
,我想选择carrier、networktype和行数,这些行正好有两种特定的网络类型,没有其他类型。因此,给出下表

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
这是我正在运行的查询

但它只返回正好有2个计数的载体!例如,302720带有WIFI_11B_G,因为它只有2个计数,但没有NONE类型。或者没有无线网络的中国移动


我想我使用having子句是正确的,我想用一个查询,而不是子查询来解决这个问题。谢谢

你似乎在要求两个特定的网络,但你想消灭那些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

内部的“预查询”获取每个运营商与您感兴趣的运营商匹配的数量,但另外,对于给定的运营商来说,计算所有匹配的数量。然后,通过where查找sum()和count()=2来删除它们。

你在说什么?无论怎样,如果你只想返回“无”和“Wifi”,那么你就不应该在
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