Sqlite SUM实体值取决于LEFT JOIN值

时间:2019-08-21 08:31:09

标签: android sql sqlite android-sqlite android-room

我正在Android上使用Room查询POJO。

我的POJO(事务)包含一个value和一个account_id。它进一步包含account(帐户实例),由@Relation获取。

交易类:

@Parcelize
class Transaction(
    @Embedded val entity: TransactionEntity,
    @Relation(entity = Account::class, parentColumn = Database.Transactions.COL_ACCOUNT_ID, entityColumn = Database.Accounts.COL_ID) val account: Account? = null
) : Model

帐户属性:

data class Account(
    @PrimaryKey(autoGenerate = true) @ColumnInfo(name = Database.Accounts.COL_ID) val id: Long = 0,
    @ColumnInfo(name = Database.Accounts.COL_NAME) val name: String = "",
    @ColumnInfo(name = Database.Accounts.COL_BALANCE) val balance: Double = 0.0
)

accounts.balance不是数据库中的值,而是属于该帐户的所有transactions.value的总和。

所以我需要对transaction.value的每个transaction.account_id = account.id求和。

它应该类似于这种方式,但是我做错了:

@androidx.room.Transaction
@Query(
    """
        SELECT transactions.* FROM transactions
        LEFT OUTER JOIN (SELECT transactions.value, SUM(transactions.value) AS balance FROM accounts) ON transactions.account_id = accounts.id
        GROUP BY transactions.id
"""
)
fun getTrs(): List<Transaction>

6 个答案:

答案 0 :(得分:0)

尝试一下:

@androidx.room.Transaction
@Query(
    """
        SELECT transactions.* FROM transactions
        LEFT OUTER JOIN (SELECT transactions.value, SUM(transactions.value) AS balance FROM accounts GROUP BY transactions.id) ON transactions.account_id = accounts.id 
"""
)
fun getTrs(): List<Transaction> 

答案 1 :(得分:0)

您已在GROUP BY子句中列出了表事务的所有必要列。

SELECT transactions.* SUM(transactions.value) AS balance
FROM transactions
LEFT JOIN accounts ON transactions.account_id = accounts.id
GROUP BY ...transactions.id, transactions.account_id.... and all necessary columns of transactions table...

希望我能帮助您!

答案 2 :(得分:0)

您可以使用子查询:

SELECT t.*,(SELECT SUM(transactions.value) FROM accounts a ON t.account_id = a.id) AS balance
FROM transactions t

答案 3 :(得分:0)

使其清洁: 首先创建余额视图

CREATE VIEW v_balance AS 
SELECT account_id, SUM(value) as account_balance
FROM transactions 
GROUP BY account_id

然后根据需要在左联接中使用该视图:

SELECT account.*, IFNULL(v_balance.account_balance, 0.0) 
FROM account
LEFT JOIN v_balance ON v_balance.account_id = account.id

答案 4 :(得分:0)

可能是这样的意思:

SELECT a.*, SUM(t.value) AS balance
FROM transactions t
LEFT JOIN accounts a
ON a.account_id = t.account_id
GROUP BY t.account_id

答案 5 :(得分:0)

我通过创建一个包装原始帐户对象的新POJO来做到这一点,但为现在要查询的总和添加了一个字段。

@Query(
    """
        SELECT accounts.*, 
        (SELECT SUM(CASE WHEN transactions.type = ${Transaction.TransactionType.EARNING} THEN transactions.value 
        ELSE -transactions.value END) FROM transactions WHERE transactions.account_id = accounts.id) AS balance
        FROM accounts
        LEFT JOIN transactions ON transactions.account_id = accounts.id
        GROUP BY accounts.id
    """
)
fun getAccountsWithBalance(): LiveData<List<AccountWithBalance>>