将小计添加到 Firebird SQL 查询中的列

Adding a subtotal to a column in a Firebird SQL query

每次 LEDGER_ACCOUNT 字段发生变化时,我都需要在我的 AMOUNT 字段中查看小计

我对此做了很多研究,看来这是工会的工作。但是我无法让工会在每次发生变化时都添加总数

我目前的select查询如下:

SELECT L.LEDGER_ACCOUNT, CURRROUND(L.DEBIT,2) - CURRROUND(L.CREDIT,2) 作为金额 从 分类账 L

目前显示以下字段:

但我需要以下 return:

我正在使用 Firebird 2.5.7。

您想要的结果可以在 Firebird 2.5 中通过使用联合和一些额外的逻辑来实现,以便能够在正确的位置插入小计和总计。如您所示,使用简化的 table LEDGER 数据,您可以使用以下查询:

SELECT 
    CASE LTYPE 
        WHEN 0 THEN CAST(ledger_account AS VARCHAR(50))
        WHEN 1 THEN 'Subtotal'
        WHEN 2 THEN 'TOTAL'
    END AS LEDGER_ACCOUNT_DISPLAY,
    AMOUNT
FROM (
    SELECT ledger_account, amount, 0 AS LTYPE
    FROM ledger
    UNION ALL
    SELECT ledger_account, SUM(amount), 1 AS LTYPE
    FROM ledger
    GROUP BY ledger_account
    UNION ALL
    -- BIN_SHL(1, 31) - 1 produces the maximum value of INTEGER; for sorting total at end
    SELECT BIN_SHL(1, 31) - 1, SUM(amount), 2 AS LTYPE
    FROM ledger
) a
ORDER BY ledger_account, LTYPE

对于 Firebird 3,您还可以使用 window 函数尝试不同的方法。此解决方案不会为小计和总计生成额外的行,而是内联生成它们。正确显示它们可能是您的表示层的责任:

SELECT ledger_account, 
 amount, 
 SUM(amount) OVER(PARTITION BY ledger_account) AS subtotal, 
 SUM(amount) OVER() AS total
FROM ledger
ORDER BY ledger_account