【问题标题】:Oracle SQL count and group by multiple fieldsOracle SQL 按多个字段计数和分组
【发布时间】:2018-08-17 04:37:23
【问题描述】:

我能够得到合并两个表的数据来得到下表。

+------------+------+--------+--------+------------+------------+
| Group Name | Type | Manger | Status | ControlOne | ControlTwo |
+------------+------+--------+--------+------------+------------+
| Group A    |    1 |      1 | finish |          2 |          2 |
| Group A    |    2 |      1 | open   |          0 |          2 |
| Group A    |    1 |      1 | finish |          0 |          0 |
| Group A    |    1 |      2 | finish |          2 |          0 |
| Group B    |    1 |      1 | open   |          2 |          0 |
| Group B    |    1 |      2 | open   |          2 |          2 |
| Group B    |    2 |      2 | open   |          0 |          2 |
| Group B    |    2 |      1 | finish |          0 |          0 |
| Group B    |    1 |      1 | open   |          2 |          0 |
+------------+------+--------+--------+------------+------------+

现在我需要根据 GroupName/ Type 和 Manager 获取总计数,以使每个组的输出格式如下:

+------------+------+-------------------------------------------------+--------------------------------------------+------------------------------+----------------------------+
| Group Name | Type |                 Manager1Finish                  |                Manager1Open                |        Manager2Finish        |        Manager2Open        |
+------------+------+-------------------------------------------------+--------------------------------------------+------------------------------+----------------------------+
| Group A    |    1 | 2(count of finish by Group A, manager1, type 1) | 0(count of open Manager1, Type 1, Group A) | 1(count of finish Manager 2) | 0(count of open manager 2) |
| Group A    |    2 | 0                                               | 1                                          | 0                            | 0                          |
+------------+------+-------------------------------------------------+--------------------------------------------+------------------------------+----------------------------+

请您帮忙看看如何实现这个目标?

【问题讨论】:

  • 您可以尝试使用 oracle 的窗口函数,例如 count(*) over (partition by some_column),详情请参阅 this

标签: sql oracle count grouping


【解决方案1】:

尝试使用 CASE WHEN:

  SELECT GroupName,
         TYPE,
         COUNT (CASE
                   WHEN     Manager = 1
                        AND status = 'Finish'
                   THEN
                      1
                END)
            AS Manager1Finish,
         COUNT (CASE
                   WHEN     Manager = 1
                        AND status = 'Open'
                   THEN
                      1
                END)
            AS Manager1Open,
         COUNT (CASE
                   WHEN     Manager = 2
                        AND status = 'Finish'
                   THEN
                      1
                END)
            AS Manager2Finish,
         COUNT (CASE
                   WHEN     Manager = 2
                        AND status = 'Open'
                   THEN
                      2
                END)
            AS Manager2Open
    FROM tablename
GROUP BY GroupName, TYPE

【讨论】:

    【解决方案2】:
    select [group], [type],
    sum(case when manager=1 and status='finish' then 1 else 0 end) as m1finish,
    sum(case when manager=1 and status='open' then 1 else 0 end) as m1open,
    sum(...etc...)
    from mytable
    group by [group],[type]
    

    【讨论】:

      猜你喜欢
      • 2012-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-05
      • 1970-01-01
      • 2018-05-17
      • 2022-07-22
      • 1970-01-01
      相关资源
      最近更新 更多