在 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 中获取每月明智的年度报告的主要内容,如果未能解决你的问题,请参考以下文章
MySQL 狠甩 Oracle 稳居 Top1,私有云最受重用,大数据人才匮乏! | 中国大数据应用年度报告