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

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

这是我想要的输出。

【问题讨论】:

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

标签: oracle oracle11g oracle10g


【解决方案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 条件来仅考虑一年的数据。

    【讨论】:

      猜你喜欢
      • 2015-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-21
      • 1970-01-01
      • 1970-01-01
      • 2020-06-29
      • 1970-01-01
      相关资源
      最近更新 更多