2013-08-20 190 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