如何选择组内的所有案例?

时间:2017-03-15 19:56:27

标签: sql oracle

我想获得表格中我的数据符合不同标准的案例数量的指标。目前,我有3个以上的团体,我们希望根据某些标准进行检查。目前,我想了解以下几点: CHESS = White的3+组记录的细分。 DATE如'%16'的3+组记录的细分 在3+组中的记录细分,包括国际象棋的所有组合=白色和DATE,如'%16'

+------------------------------------------------+
| GroupID    |    CHESS |   DATE   |
|    1       |  White   |  n16       |
|    1       | Black    |   n16      |
|    1       | Black    |   n03      |
|    2       |  White   |   n16      |
|    2       |  White   | n10        |
|    2       |    White | n11       |
|    3       |   Black  | n12      |
|    3       |   White  |    n14   |
|    3       |  Black   | n16      |
---------------------------------------------------

输出类似于:

国际象棋数量为1 = 2

国际象棋数量为2 = 0

国际象棋数量为3 = 1

日期计数1 = 2

日期计数2 = 1

日期计数3 = 0

国际象棋计数为1且日期计数为1 = 1的案例

国际象棋计数为2且日期计数为2 = 0的案例

国际象棋数为3且日期数为3 = 0的案例

国际象棋计数为1且计数日期为2 = 1的案例

国际象棋计数为1且计数日期为3 = 0的案例

国际象棋计数为2且计数日期为1 = 0的案例

国际象棋计数为2且计数日期为3 = 0的案例

国际象棋数为3且计数日期为1 = 1的案例

国际象棋计数为3且计数日期为2 = 0的案例

这可以通过考虑任何大小的组的方式来完成,还是必须特定于组大小(例如,查询仅适用于3组)?

1 个答案:

答案 0 :(得分:0)

您可以使用group by cube和其他人在此处执行此操作:

with groups as (select count(case when chess = 'White' then 1 end) cnt_white,
                       count(case when tdate = 'n16' then 1 end) cnt_n16
                  from t group by groupid), 
     numbers as (select level grp from dual connect by level <= 3)
select white, n16, cnt
  from (
    select n1.grp white, n2.grp n16, count(cnt_white) cnt, grouping_id(n1.grp, n2.grp) gid
      from numbers n1 
        cross join numbers n2 
        left join groups on n1.grp = cnt_white and n2.grp = cnt_n16
      group by cube(n1.grp, n2.grp)
      having grouping_id(n1.grp, n2.grp) <> 3 )
  order by case when gid = 1 then 1 when gid = 2 then 2 when gid = 0 then 3 end, white, n16

rextester demo

修改子查询3中的级别numbers以更改组数。