向 Firebird SQL 查询中的列添加小计

Posted

技术标签:

【中文标题】向 Firebird SQL 查询中的列添加小计【英文标题】:Adding a subtotal to a column in a Firebird SQL query 【发布时间】:2019-04-27 16:25:38 【问题描述】:

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

我对此进行了大量研究,看来这是工会的工作。但是每次有变化时我都无法让工会添加总数

我目前的选择查询如下:

选择 L.LEDGER_ACCOUNT, CURRROUND(L.DEBIT,2) - CURRROUND(L.CREDIT,2) 作为金额 从 分类帐L

目前它显示以下字段:

但我需要以下回报:

我使用的是 Firebird 2.5.7。

【问题讨论】:

为了简化我的问题,请考虑以下查询:SELECT L.LEDGER_ACCOUNT, CURRROUND(L.DEBIT,2) - CURRROUND(L.CREDIT,2) AS AMOUNT FROM LEDGER L 所以基本上我每次 L.LEDGER_ACCOUNT 字段发生变化时,都需要对 AMOUNT 字段进行小计。我将使用 ORDER BY 语句按 L.LEDGER_ACCOUNT 排序。 请用其他信息编辑您的问题,不要将其放入 cmets。如果您提供示例数据和预期结果会很有帮助,因为现在我并不完全清楚您想要什么。还要指定您正在使用的 Firebird 版本。 感谢您的反馈。我已按照建议进行了更改。 这也可以是stored procedure的工作 【参考方案1】:

您想要的结果可以在 Firebird 2.5 中通过使用联合和一些额外的逻辑来实现,以便能够在正确的位置插入小计和总计。使用带有您显示的数据的简化表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,您还可以使用窗口函数尝试不同的方法。此解决方案不会为小计和总计生成额外的行,而是内联生成它们。然后,您的表示层可能有责任正确显示它们:

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

【讨论】:

谢谢先生。这非常有效。现在我需要开始添加额外的字段。谢谢。

以上是关于向 Firebird SQL 查询中的列添加小计的主要内容,如果未能解决你的问题,请参考以下文章

SELECT 语句中的列别名不适用于 SQuirrel SQL + Firebird

如何在 SQL 中获取时间数据类型的小计?

如何添加特定列值的小计?

使用数据透视表(熊猫)中的小计行时保留索引部分(不同的列)

如何更改 firebird3 中的列类型

如何在 power bi 中向现有数据添加小计行