SQLite在1列中的值计数和按ID分组

时间:2018-01-02 04:06:00

标签: sqlite count

我一直在努力计算我的表的值,到目前为止它没有给我预期的输出。我已经尝试过Count和Group By的所有组合,但没有任何效果。

这是我表格的片段

=========================
id | budget_id | type
=========================
1  | 1         | expenses
2  | 1         | expenses
3  | 1         | savings
4  | 1         | expenses
5  | 1         | expenses
6  | null      | savings
7  | 1         | savings
8  | 2         | expenses
9  | 2         | savings

所以我想要计算费用和节省的总数,并按budget_id

进行分组

预期输出必须是这样的(必须忽略budget_id中的空值,因此budget_id = 1的节省为'2'):

=============================================
budget_id | savings         | expenses
=============================================
1         | 2               | 4
2         | 1               | 1

但输出是这样的:

=============================================
budget_id | savings         | expenses
=============================================
null      | 1               | 1
1         | 2               | 2
1         | 4               | 4
2         | 1               | 1
2         | 1               | 1

这是查询:

SELECT budget_id, count(CASE type WHEN 'savings' THEN 1 ELSE 0 END) savings, count(CASE type WHEN 'expenses' THEN 1 ELSE 0 END) expenses
from expenses_savings
group by budget_id, type

谢谢!

2 个答案:

答案 0 :(得分:0)

count更改为sum,并仅按budget_id聚合:

SELECT
    budget_id,
    SUM(CASE WHEN type = 'savings'  THEN 1 ELSE 0 END) number_of_saved,
    SUM(CASE WHEN type = 'expenses' THEN 1 ELSE 0 END) number_of_spent
FROM expenses_savings
GROUP BY budget_id

除了使用错误的分组外,使用COUNT的问题在于它实际上只计算零和一。如果您想使用COUNT,那么您可以尝试以下查询:

SELECT
    budget_id,
    COUNT(CASE WHEN type = 'savings'  THEN 1 END) number_of_saved,
    COUNT(CASE WHEN type = 'expenses' THEN 1 END) number_of_spent
FROM expenses_savings
GROUP BY budget_id

现在,对于非匹配类型,计算的值将为NULL(这是ELSE表达式中的默认CASE值),因此计数将忽略该值。 / p>

答案 1 :(得分:0)

请勿在{{1​​}}中加入type,因此您在同一预算中不会有多个结果。

使用group by代替sum来计算不同的事件。

明确排除预算为空的行。

count