SQLITE:显示每个类别的总数(总和)

Posted

技术标签:

【中文标题】SQLITE:显示每个类别的总数(总和)【英文标题】:SQLITE: Show total (sum) for each category 【发布时间】:2012-06-04 14:05:57 【问题描述】:

我有两个表(输入和类别):

CREATE TABLE categories (
    iId INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    sName TEXT NOT NULL,
    iParent INTEGER,
    FOREIGN KEY (iParent) REFERENCES categories(iId)
);

CREATE TABLE inputs (
    iId INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    iCategory INTEGER,
    dValue DOUBLE NOT NULL,
    FOREIGN KEY (iCategory) REFERENCES categories(iId)
);

我需要从输入表中为每个类别获取总和(dValue 列)。即使总和结果为零。

如果我能得到每个父类别的总和会更好(categories.iId = categories.iParent时,将子类别的结果与父类别相加)

谁能帮帮我?我很感激任何帮助! 谢谢!

【问题讨论】:

在第二部分(将子类别与父类别组合) - 您的类别嵌套层次结构有多深? 您是否可以提供一个样本数据集,其预期输出涵盖所有可能的边缘情况(父类有子类别、父类没有子类别、类别没有输入等)? 【参考方案1】:

试试这个:

select c.iParent, sum(i.dValue)
from categories c
left outer join inputs i on i.iCategory=c.iId
group by c.iParent

编辑:使用帐户:

select c.iParent, a.iCurrency, sum(i.dValue)
from categories c
left outer join inputs i on i.iCategory=c.iId
left outer join accounts a on i.iAccount=a.iId
group by c.iParent,a.iCurrency

【讨论】:

+1 我想知道Even if the sum result is zero. OP 是否意味着没有输入。在那种情况下应该有coalesce(sum(i.dValue), 0) @mellamokb 对——或者sum(coalesce(i.dValue, 0)) 现在,我需要为前面没有描述的字段实现一些 Where 子句。但是当我这样做时,它只返回带有输入的类别。请参阅:select c.iParent, sum(coalesce(i.dValue,0)) from categories c left outer join inputs i on i.iCategories=c.iId WHERE c.iType=0 AND i.dtDate BETWEEN '2012-06-01' AND '2012-06-05' group by c.iParent。如何显示所有类别,但仅在满足条件时才对值求和?谢谢 @Daniel 将条件从WHERE 子句移到ON 子句中:left outer join inputs i on i.iCategory=c.iId AND c.iType=0 AND i.dtDate BETWEEN '2012-06-01' AND '2012-06-05' @Daniel 看看编辑。现在,每个类别将产生与该类别中输入的货币一样多的行。

以上是关于SQLITE:显示每个类别的总数(总和)的主要内容,如果未能解决你的问题,请参考以下文章

Sqlite 中每个类别的前 n 个计数

Sqlit--学习教程(简介)

Android SQLit数据库学习

Sqlit--学习教程(建立数据库表)

Sqlit--学习教程(命令)

基于另一列的每个值的列值总和,然后除以总数