2013-10-08 94 views
0

有兩列的表,carriernetworktype我想選擇載體,網絡類型和具有2個特定網絡類型且沒有其他網絡類型的行數。所以下面的表中給出SQL有兩種類型但不再有

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但沒有的CHINAMOBILE。

我想我在正確的軌道與條款,我想解決這個只是一個單一的查詢,沒有子查詢。謝謝!

+0

你在說什麼?不管如果你想只返回'None'和'Wifi',那麼你不應該使用IN –

回答

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」得到每個載波那些你有多少比賽很感興趣,但除此之外,所有計數對於給定的載體。然後,他們通過尋找sum()和count()= 2的地方被移除。

相關問題