向 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 查询中的列添加小计的主要内容,如果未能解决你的问题,请参考以下文章