2013-08-20 94 views
1

計數不同的值集的同一列在單個組中我有一個表(SQLite的DB)這樣,by子句

CREATE TABLE parser (ip text, user text, code text);

現在我需要算code有多少,值爲1, 2, or 3,以及有多少不是,由ip組成的字段。

但是,據我所知,我不能完全做到這一點,但有兩個SQL短語。

e.g

select count(*) as cnt, ip 
from parser 
where code in (1, 2, 3) 
group by ip 
order by cnt DESC 
limit 10 

並有not in查詢。

那麼,我可以將兩個查詢合併成一個單一的?

回答

1

這會告訴您每ip兩項罪名,一個是地方code有值1,2或3,另算爲所有的休息(一切,但1,2,3,包括NULL。)

SELECT ip, 
     COUNT(CASE WHEN code IN (1, 2, 3) THEN 1 ELSE NULL END) AS cnt_in, 
     COUNT(CASE WHEN code IN (1, 2, 3) THEN NULL ELSE 1 END) AS cnt_rest 
FROM parser 
GROUP BY ip 
ORDER BY cnt_in DESC ; 

這將你給你整數值的休息和第三對具有NULLcode行3個計數,一爲1,2,3,另:

SELECT ip, 
     COUNT(CASE WHEN code IN (1, 2, 3) THEN 1 END) AS cnt_in, 
     COUNT(CASE WHEN code NOT IN (1, 2, 3) THEN 1 END) AS cnt_not_in, 
     COUNT(CASE WHEN code IS NULL THEN 1 END) AS cnt_null 
FROM parser 
GROUP BY ip 
ORDER BY cnt_in DESC ; 

如果你想限制的第一個結果(如您的代碼)前10行,第二個結果到其他前10行,您可以使用兩個子查詢和UNION

(SELECT ip, 
     COUNT(*) AS cnt, 
     'in' AS type 
    FROM parser 
    WHERE code IN (1, 2, 3) 
    GROUP BY ip 
    ORDER BY cnt DESC 
    LIMIT 10 
) 
UNION ALL 
(SELECT ip, 
     COUNT(*) AS cnt, 
     'not in' AS type 
    FROM parser 
    WHERE code NOT IN (1, 2, 3) 
    GROUP BY ip 
    ORDER BY cnt DESC 
    LIMIT 10 
) ; 

測試在SQL-Fiddle