oracle 统计表

hs1ihplo  于 2023-10-16  发布在  Oracle
关注(0)|答案(2)|浏览(125)

我做了一个编辑。我想知道什么是最好的方式存储和查看条目时,我希望有一个客户组在列以及。它仍然是possible存储像你建议的值,使一个简单的视图?
这里编辑的问题:我希望在oracle中有一个统计表。该表应如下所示:编辑
| 年|客户||Jan| Feb|......这是什么?|Dec|
| --|--|--|--|--|--|--|
| 2023 |Customer1|第一条| 1 | 1 |......这是什么?| 1 |
| 2023 |Customer1| Article2| 1 | 1 |......这是什么?| 1 |
| 2023 |Customer1|总和| 2 | 2 |......这是什么?| 2 |
| | | | | | | |
| 2023 |客户2|第一条| 1 | 1 |......这是什么?| 1 |
| 2023 |客户2| Article2| 1 | 1 |......这是什么?| 1 |
| 2023 |客户2|总和| 2 | 2 |......这是什么?| 2 |
| 2023 |客户3|第一条| 1 | 1 |......这是什么?| 1 |
| 2023 |客户3| Article2| 1 | 1 |......这是什么?| 1 |
| 2023 |客户3|总和| 2 | 2 |......这是什么?| 2 |
| 2023 |客户群|第一条| 1 | 1 |......这是什么?| 1 |
| 2023 |客户群|Article2| 1 | 1 |......这是什么?| 1 |
| 2023 |客户群|总和| 2 | 2 |......这是什么?| 2 |
客户组可以是例如客户3、客户4和客户5的组。我想知道存放这种table的最好方法是什么。我的意思是,是创建一个像上面这样的表更好,还是可以通过视图来实现目标?
但是,在表中存储值的最佳方式是什么?视图应该如何创建?或者有没有更好的方法来处理这样的事情?

yruzcnhs

yruzcnhs1#

在我看来,table不应该是这样的。你会以表格的形式呈现给用户,因为它更容易阅读,但是-要将数据存储到表中,我建议这样做:

create table statistic
  (statistic_id number primary key,
   customer_id  number    constraint fk_st_cust references customer,
   article      varchar2(20),
   year         number(4),
   month        number(2) constraint ch_st_mon check (month between 1 and 12),
   amount       number
  );

我不知道值实际上代表什么(article应该是另一个表的外键吗?什么是amount?),也不知道应该对其应用哪些约束(例如,2854年是否有效?金额可以是负数吗?)。每个月/年/客户可以有多少行?
视图将是

create or replace view v_statistic as
  select c.customer_name, 
         s.year, 
         s.article,
         sum(case when month =  1 then s.amount else 0 end) january,
         sum(case when month =  2 then s.amount else 0 end) february,
         ...
         sum(case when month = 12 then s.amount else 0 end) december
  from statistic s join customer c on c.customer_id = s.customer_id
  group by c.customer_name, s.year, s.article

这可能需要根据实际数据和需求进行修改,但-很快-这就是我要做的。

q35jwt9p

q35jwt9p2#

您可以在ROLLUP中使用条件聚合:

CREATE VIEW table_name_statistics (year, username, type, jan, feb, mar) AS
SELECT EXTRACT(YEAR FROM datetime) AS year,
       username,
       CASE
       WHEN GROUPING_ID(type) = 1
       THEN 'sum'
       ELSE type
       END AS type,
       COALESCE(SUM(CASE WHEN EXTRACT(MONTH FROM datetime) = 1 THEN 1 END), 0) AS jan,
       COALESCE(SUM(CASE WHEN EXTRACT(MONTH FROM datetime) = 2 THEN 1 END), 0) AS feb,
       COALESCE(SUM(CASE WHEN EXTRACT(MONTH FROM datetime) = 3 THEN 1 END), 0) AS mar
FROM   table_name t
GROUP BY
       EXTRACT(YEAR FROM datetime),
       username,
       ROLLUP(type)
ORDER BY
       year,
       username,
       t.type NULLS LAST

其中,对于样本数据:

CREATE TABLE table_name (datetime, username, type) AS
  SELECT DATE '2023-01-01', 'Customer1', 'Article1' FROM DUAL UNION ALL
  SELECT DATE '2023-02-01', 'Customer1', 'Article1' FROM DUAL UNION ALL
  SELECT DATE '2023-03-01', 'Customer1', 'Article1' FROM DUAL UNION ALL
  SELECT DATE '2023-01-01', 'Customer1', 'Article2' FROM DUAL UNION ALL
  SELECT DATE '2023-02-01', 'Customer1', 'Article2' FROM DUAL UNION ALL
  SELECT DATE '2023-03-01', 'Customer1', 'Article2' FROM DUAL UNION ALL
  SELECT DATE '2023-01-01', 'Customer2', 'Article1' FROM DUAL UNION ALL
  SELECT DATE '2023-02-01', 'Customer2', 'Article1' FROM DUAL UNION ALL
  SELECT DATE '2023-03-01', 'Customer2', 'Article1' FROM DUAL UNION ALL
  SELECT DATE '2023-01-01', 'Customer2', 'Article2' FROM DUAL UNION ALL
  SELECT DATE '2023-03-01', 'Customer2', 'Article2' FROM DUAL;

然后视图输出:
| 年|用户名|类型|Jan| Feb| Mar|
| --|--|--|--|--|--|
| 2023 |Customer1|第一条| 1 | 1 | 1 |
| 2023 |Customer1| Article2| 1 | 1 | 1 |
| 2023 |Customer1|总和| 2 | 2 | 2 |
| 2023 |客户2|第一条| 1 | 1 | 1 |
| 2023 |客户2| Article2| 1 | 0 | 1 |
| 2023 |客户2|总和| 2 | 1 | 2 |
fiddle

相关问题