首页 > 解决方案 > 我应该如何构建需要大量聚合的表?

问题描述

我正在创建一个名为 的表monthly_revenue,它将存储显示在每月收入报告 csv 中的列。每行包含一个月和一年的收入数据。大约有 60 列收入数据。数据是从其他八个表中汇总而来的。例如,monthly_revenue包含以下列:

CREATE TABLE IF NOT EXISTS monthly_revenue (
    id serial PRIMARY KEY,
    date TIMESTAMP WITHOUT TIME ZONE NOT NULL,
    pkg_revenue DOUBLE PRECISION NOT NULL,
    reseller_revenue DOUBLE PRECISION NOT NULL,
    pkg_revenue DOUBLE PRECISION NOT NULL,
    setup_amount DOUBLE PRECISION NOT NULL,
    support_amount DOUBLE PRECISION NOT NULL,
    promo_credit DOUBLE PRECISION NOT NULL
    federal_fee DOUBLE PRECISION NOT NULL,
    total_monthly_revenue DOUBLE PRECISION NOT NULL
);

该列monthly_revenue.pkg_revenue等于月份和年份的其他两个聚合的总和:((SUM(invoices.pkg_cost)) + (SUM(pkg_archive.pkg_cost)))

一些列聚合多个其他列在monthly_revenue. 例如,列monthly_revenue.total_monthly_revenue等于SUM(pkg_revenue + reseller_revenue + setup_amount + support_amount - promo_credit - federal_fee)

我目前的计划是创建一个名为 的表monthly_revenue_variables,该表将存储聚合在monthly_revenue. 我将使用具有月份和年份的函数作为聚合列(如)的参数monthly_revenue_variables.pkg_revenue,然后可以将monthly_revenue.total_monthly_revenue这些列与 中的其他五个列一起聚合monthly_revenue_variables

我不喜欢我当前的计划冗余存储数据;monthly_revenue.pkg_revenue并且monthly_revenue_variables.pkg_revenue将包含给定月份和年份的完全相同的值。但是,我喜欢这样monthly_revenue_variables会使我的 sql 代码变平,这样我就不会在monthly_revenue.total_monthly_revenue.

或者,我正在考虑使用一系列公用表表达式 (CTE) 来代替monthly_revenue_variables.

我对 sql 比较陌生,所以monthly_revenue欢迎任何关于如何构造创建和填充的建议!

标签: sqlpostgresqldatabase-design

解决方案


推荐阅读