首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按每项金融资产分列的不同类别的和值

按每项金融资产分列的不同类别的和值
EN

Code Review用户
提问于 2022-09-04 02:01:51
回答 1查看 59关注 0票数 5

我的SQLite数据库:

代码语言:javascript
复制
CREATE TABLE Movimentacao
( mydate DATE
, dividend_type VARCHAR(200)
, dividends DECIMAL(19, 2)
, ticker VARCHAR(300)
);

插入一些数据:

代码语言:javascript
复制
INSERT INTO Movimentacao VALUES
  ('2021-09-01', 'Dividend',  140, 'BBAS3 - BANCO DO BRASIL')
, ('2021-09-14', 'Dividend',  14,  'PETR4 - PETROBRAS SA')
, ('2021-09-14', 'Refund',    30,  'PETR4 - PETROBRAS SA')
, ('2021-09-04', 'JCP',       100, 'PETR4 - PETROBRAS SA')
, ('2021-09-03', 'Others',    11,  'VGIP12 - VALORA CRI ÍNDICE DE PREÇO FII')
, ('2021-09-21', 'Others',    22,  'IRDM11 - IRIDIUM FII')
, ('2021-10-07', 'Dividend',  100, 'BBAS3 - BANCO DO BRASIL')
;

我的目标是创建下面的查询(正常工作!)但是我想知道是否有一种更优雅的方法来构建我的代码:

有帮助缩小/改进代码吗?

代码语言:javascript
复制
WITH AddColumns AS (
    SELECT
        substr(ticker, 1, INSTR(ticker, ' ')) AS ticker,

        CASE WHEN dividend_type = 'Dividend'
          THEN sum(dividends)
        END AS 'Dividend',
        
        CASE WHEN dividend_type = 'Refund' 
          THEN sum(dividends)
        END AS 'Refund',
        
        CASE WHEN dividend_type = 'JCP' 
          THEN sum(dividends)
        END AS 'JCP'
        
        FROM Movimentacao
        WHERE dividend_type IN ('Dividend', 'JCP', 'Refund') and mydate > '2021-01-01'
        GROUP BY ticker, dividend_type
), RemoveNullAndSum AS (
            SELECT ticker, sum(coalesce(Dividend,0)) as Dividend, 
                         sum(coalesce(JCP,0)) as JCP,
                         sum(coalesce(Refund,0)) as Refund
                FROM AddColumns
            GROUP BY ticker
), CreateTotalColumn AS (
    SELECT ticker, round(Dividend+Refund,2) as Dividend, 
                 round(JCP,2) as JCP,
                 round(Dividend+JCP+Refund,2) as Total FROM RemoveNullAndSum
)
    SELECT * FROM CreateTotalColumn
    UNION ALL
    SELECT 'TOTAL', round(sum(Dividend),2), round(sum(JCP),2), round(sum(Total),2) 
    FROM CreateTotalColumn

代码链接:https://dbfiddle.uk/?rdbms=sqlite_3.27&fiddle=5ac6537432906bd88ff3a85a6c3f0959

EN

回答 1

Code Review用户

发布于 2022-10-16 17:15:09

我从您的代码中更改了一些东西,使其比当前版本更加简化:

  • SUM聚合函数与CASE滤波运算位置的倒置
  • CASE内部,由于要将退款加到每种"dividend_type",而且股利类型为两种,所以您可以通过筛选出不感兴趣的股息来总结所需的值。
  • 将“总”字段的所有不同红利类型的和简化为一个简单的SUM(dividends),它将得到所有感兴趣的"dividend_types",并给出过滤条件WHERE dividend_type IN ('Dividend', 'JCP', 'Refund')
  • 使用没有分区的聚合直接从中间结果计算汇总。
代码语言:javascript
复制
WITH cte AS (
    SELECT SUBSTR(ticker, 1, INSTR(ticker, ' '))     AS ticker,
           SUM(CASE WHEN dividend_type <> 'JCP'
                    THEN dividends ELSE 0 END)       AS Dividend,
           SUM(CASE WHEN dividend_type <> 'Dividend'
                    THEN dividends ELSE 0 END)       AS JCP,
           SUM(dividends)                            AS Total
    FROM Movimentacao
    WHERE dividend_type IN ('Dividend', 'JCP', 'Refund') AND mydate > '2021-01-01'
    GROUP BY ticker
)
SELECT * FROM cte
UNION ALL
SELECT 'TOTAL', SUM(Dividend), SUM(JCP), SUM(Total) FROM cte

检查演示这里

票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/279436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档