私は金融口座に関するレポートを作成しており、最初の数値に応じたレベルで値を合計する必要があります...たとえば、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 レベル (5 桁の数字) のみです...一般的な解決策はありますか? 明日、6レベルが必要になるとしたら...
これがSQLフィドルです
ありがとう。