在 oracle 中获取每月明智的年度报告

Posted

技术标签:

【中文标题】在 oracle 中获取每月明智的年度报告【英文标题】:Get month wise yearly report in oracle 【发布时间】:2020-06-24 13:10:21 【问题描述】:

我有一个员工表,其中包含以下字段员工姓名、工资日期、我想按月汇总记录的工资。这里是表数据。我正在使用 oracle 数据库 11g

这是我想要的输出。

【问题讨论】:

请不要粘贴图片,数据和代码使用格式化文本。 你为自己尝试了什么?这不是免费的编码服务,如果您展示自己尝试过的内容,通常会得到更好的响应。 【参考方案1】:

您可以在GROUP BY 中使用ROLLUP

WITH t(NAME, dt, w) AS (
    SELECT 'adam', DATE '2020-01-01', 200 FROM dual UNION ALL
    SELECT 'adam', DATE '2020-02-01', 200 FROM dual UNION ALL
    SELECT 'adam', DATE '2020-03-01', 200 FROM dual UNION ALL
    SELECT 'jhone', DATE '2020-01-01', 100 FROM dual UNION ALL
    SELECT 'jhone', DATE '2020-02-01', 200 FROM dual UNION ALL
    SELECT 'jhone', DATE '2020-03-01', 151 FROM dual
    )
SELECT NAME, NVL(TO_CHAR(dt, 'fmMon'), 'total') AS mon, SUM(w) AS sum_w
FROM t
GROUP BY NAME, ROLLUP(TO_CHAR(dt, 'fmMon'));


+-----------------+
|NAME |MON  |SUM_W|
+-----------------+
|adam |Feb  |200  |
|adam |Jan  |200  |
|adam |Mar  |200  |
|adam |total|600  |
|jhone|Feb  |200  |
|jhone|Jan  |100  |
|jhone|Mar  |151  |
|jhone|total|451  |
+-----------------+

如果你需要转置你的结果,你可以PIVOT它:

WITH t(NAME, dt, w) AS (
    SELECT 'adam', DATE '2020-01-01', 200 FROM dual UNION ALL
    SELECT 'adam', DATE '2020-02-01', 200 FROM dual UNION ALL
    SELECT 'adam', DATE '2020-03-01', 200 FROM dual UNION ALL
    SELECT 'jhone', DATE '2020-01-01', 100 FROM dual UNION ALL
    SELECT 'jhone', DATE '2020-02-01', 200 FROM dual UNION ALL
    SELECT 'jhone', DATE '2020-03-01', 151 FROM dual
    )
SELECT *
FROM (
    SELECT NAME, NVL(TO_CHAR(dt, 'fmMon'), 'total') AS mon, SUM(w) AS sum_w
    FROM t
    GROUP BY NAME, ROLLUP(TO_CHAR(dt, 'fmMon'))
    )
PIVOT (
   SUM(sum_w)
   FOR mon IN ('Jan','Feb','Mar','total')
    );
    
+-------------------------------+
|NAME |'Jan'|'Feb'|'Mar'|'total'|
+-------------------------------+
|adam |200  |200  |200  |600    |
|jhone|100  |200  |151  |451    |
+-------------------------------+

【讨论】:

【参考方案2】:

您可以按如下方式使用条件聚合:

Select name,
       Sum(case when to_char(date,'mon') = 'jan' then wages end) as jan,
       Sum(case when to_char(date,'mon') = 'feb' then wages end) as feb,
       ...
       Sum(wages) as total
From yourTable
Group by name;

您需要使用 where 条件来仅考虑一年的数据。

【讨论】:

以上是关于在 oracle 中获取每月明智的年度报告的主要内容,如果未能解决你的问题,请参考以下文章

如何生成Oracle AWR报告

怎么查看qq年度报告

MySQL 狠甩 Oracle 稳居 Top1,私有云最受重用,大数据人才匮乏! | 中国大数据应用年度报告

2021-2022中国自动驾驶产业年度总结报告

如何在oracle sql developer中按年和月分组获取当前财政年度的数据?

使用 MDX 从层次结构中获取当前会计年度