带有WHERE子句的多个count()

时间:2014-03-13 02:54:17

标签: android sqlite

我有一个包含flashcard对象的SQL表。该表有一列表明闪卡是免费还是付费。抽认卡分为几类。在我的Android应用程序中,我需要显示每个类别的免费抽认卡数量,以及支付的抽认卡数量。如果闪卡不是免费的,则支付。

我的SQL不是很好,到目前为止我有一个查询,它返回免费的抽认卡数量:

SELECT _id, category_primary, count(category_primary) FROM Flashcards WHERE available = '1' GROUP BY category_primary;

我想尝试在单个查询/光标中获取免费和付费闪卡的计数,因为我使用适配器在ListView中显示结果。

3 个答案:

答案 0 :(得分:2)

您可以将available列添加到GROUP BY:

SELECT
    _id,
    category_primary,
    available,
    count(category_primary) 
FROM 
    Flashcards 
GROUP BY
    available,
    category_primary;

顺便说一下,我原本期望你在原始查询和这个更新版本中都需要_id列 - 我把它留了出来因为我假设你的原始查询工作正常。

答案 1 :(得分:0)

select f.category_primary, count(f1._id)as available_count, count(f0._id)as disable_count
from (select _id, category_primary from Flashcards) f 
left join (select _id from Flashcards where available='1') f1 on f1._id=f._id
left join (select _id from Flashcards where available='0') f0 on f0._id=f._id
group by f.category_primary

答案 2 :(得分:0)

史蒂芬芬顿的答案很接近,但并不是我想要的。我在这里找到了答案:How to get multiple counts with one SQL query?

对我有用的查询是:

SELECT
    _id,
    category_primary,
    sum(CASE WHEN Flashcards.available = '1' THEN 1 ELSE 0 END) category_free,
    sum(CASE WHEN Flashcards.available = '0' THEN 1 ELSE 0 END) category_paid
FROM
    Flashcards
GROUP BY
    category_primary;

我认为专栏available的命名很差,而且我没有非常清楚地说出我的问题。该列的更好名称是is_free感谢那些帮助回答我问题的人!