【问题标题】:SQLite SUM with hierarchy values具有层次结构值的 SQLite SUM
【发布时间】:2021-10-20 06:22:49
【问题描述】:

我的付款分析应用具有以下简化结构:

付款

CREATE TABLE payments (
payment_Id TEXT NOT NULL, 
payment_type INTEGER NOT NULL, 
payment_name TEXT NOT NULL, 
payment_category INTEGER NOT NULL,
payment_date TEXT NOT NULL,
payment_cost TEXT NOT NULL, PRIMARY KEY(payment_Id))

类别

CREATE TABLE categories (
category_Id INTEGER NOT NULL,
idRoot TEXT NOT NULL,
category_Name TEXT NOT NULL,
category_Type INTEGER NOT NULL, PRIMARY KEY(category_Id))

外键:category.category_Id = payment_category

类别以树形层次结构:

IdRoot category_Id Name
- 0 Unknown
0. 1 Expenses
0.1. 2 House
0.1. 3 Transport
0.1. 4 Travel
0.1.2. 5 Internet
0.1.2. 6 Groceries
0.1.2. 7 Water
0.1.3. 8 Car
0.1.3. 9 Public Transport
0.1.3.8. 10 Gasoline
0.1.3.8. 11 Tolls
... ... ....

付款可以分配到任何类别(category_Id = 0 除外)。

我想知道是否可以仅使用 SQLite(与 Android 兼容)来获取父类别的所有子类别以及分配给该级别中每个类别及其子类别的 payment_cost 总和。

示例:给定类别 Transport(category_Id: 3),sqlite 将返回 Car 和 Public Transport 及其总和,但 Car 的总和还将包括分配给 Gasoline 和 Tolls 的 payment_cost,如下所示

Input: category_Id: 3
Data: 
| payment_name   |  payment_cost| payment_category   |
| ------------   | ----------   | -----------------  |
| Gas Station    | 50,3         | 10                 |
| Metro          | 2,4          | 9                  |
| Tool NY - Phil | 21           | 11                 |
| Car cleaning   | 11           | 8                  |

结果

category_name Total
Car 82,3 (50,3 + 21 + 11)
Public Transport 2,4

提前感谢您的时间和知识

【问题讨论】:

    标签: android sql sqlite android-sqlite


    【解决方案1】:

    您可以使用like 来获取匹配的根:

    select sum(payment_cost)
    from payments p join
         categories c
         on p.payment_category = c.category_id cross join
         categories c3
         on c3.category_id = 3
    where p.idroot like c3.idroot || '%'
    

    【讨论】:

    • 感谢您的快速回复,恐怕我没有正确解释自己。检查编辑。我使用了类似的解决方案来获取与某个类别及其所有子项关联的付款,但正如您在编辑中看到的那样,我希望结果仅按给定类别的直接子项分组,但包含所有子项的总和儿童
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    • 1970-01-01
    • 2020-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多