sql - PostgreSQL 8.4 : Summation by account numbers

标签 sql postgresql sum postgresql-8.4

我正在做一些关于财务账户的报告,我需要根据初始数字对各个级别的值求和... 例如,对以 0(01、011、012..)或 1(1、10、111...)或 111(111,1112,1113...)开头的帐户的所有值求和等.

这是简化的示例表:

CREATE TABLE account(id, acctNo, credit) AS (
    VALUES
       (1, '01', 100)
      ,(2, '011', 200)
      ,(3, '0112', 300)
      ,(4, '014', 400)
      ,(5, '0144', 500)
      ,(6, '0148', 600)
      ,(7, '01120', 100)
      ,(8, '01121', 100)
      ,(9, '0140', 50)
      ,(10,'02', 50)
      ,(11,'021', 50)
      ,(12,'1', 50)
      ,(13,'10', 100)
      ,(15,'100', 50)    
      ,(14,'1021', 50)
      ,(16,'202', 50)
      ,(17,'221', 50)
      ,(18,'4480', 50)
      ,(19,'447', 50)
      ,(20,'5880', 50)
    )

我设法做到了,但它是一种健壮的 SQL,有没有更好的解决方案? 这是代码:

WITH
    a AS (SELECT SUBSTRING(acctNo,1,1) AS LEVEL,
    SUM(credit)  AS sum1 FROM account GROUP BY LEVEL
    ORDER BY LEVEL),
    b AS
   (SELECT SUBSTRING(acctNo,1,2) AS level2,
    SUM(credit) FROM account GROUP BY level2
    ORDER BY level2),
        c AS
   (SELECT SUBSTRING(acctNo,1,3) AS level3,
    SUM(credit) FROM account GROUP BY level3
    ORDER BY level3),
    d AS (SELECT SUBSTRING(acctNo,1,4) AS level4,
    SUM(credit) FROM account GROUP BY level4
    ORDER BY level4),
     e AS (SELECT SUBSTRING(acctNo,1,5) AS level5,
    SUM(credit) FROM account GROUP BY level5
    ORDER BY level5)

 SELECT * FROM
 (SELECT a.* FROM a
 UNION (SELECT b.* FROM b WHERE char_length(level2)>=2)
 UNION (SELECT c.* FROM c WHERE char_length(level3)>=3)
 UNION (SELECT d.* FROM d WHERE char_length(level4)>=4)
 UNION (SELECT e.* FROM e WHERE char_length(level5)>=5)) a
 ORDER BY LEVEL

这仅适用于 5 个级别(五位数字)...是否有一些通用的解决方案?如果明天我需要 6 个级别,等等...

这里是 SQL Fiddle

谢谢。

最佳答案

耶 generate_series!

SELECT substring(a.acctNo from 1 for g.g) as level, sum(a.credit)    
FROM account a, generate_series(1,5) g
where length(a.acctNo) >= g.g
group by 1
order by 1

关于sql - PostgreSQL 8.4 : Summation by account numbers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16943196/

相关文章:

R 对每行中的某些列求和

sql - 查询列出 SQL Server 存储过程以及每个过程的代码行

php - 对数据库中的用户 'timeline' 事件进行建模的最佳方法

mysql - 如何将 800MB .sql 文件导入到 Windows/phpmyadmin 的 XAMPP

postgresql - 基于另一个属性的自动增量属性

MySQL获取具有相同id的表的总和

mysql - 在数据库表中的旧记录之后插入一条新记录

java - 使用jdbc时如何调用预先配置的postgres函数?

sql - 使用一个 SQL 查询更新所有行

google-sheets - 计算谷歌电子表格中项目总和的公式