如何总结自定义组的值

时间:2015-01-22 14:33:09

标签: sql postgresql

我有选择查询,返回每个子组中元素的数量(如下图所示)。现在我想做两件事:

  1. 限制子组数
  2. 有限子组的总和数
  3. SELECT results

    我想获得以下结果(如下图所示):只有3个子组(当前结果中的子组1和2保持原样,所有其他子组作为子组3组合在一起,它们各自的计数总和所有小组都一样。

    desired_results

    SELECT inner_counts.level4 as group,  inner_counts.luc as subgroup, SUM(inner_counts.count_no)
    
    FROM (SELECT original_table2.level
    , CASE original_table2.level 
        WHEN 1 THEN 1
        WHEN 2 THEN 2
        WHEN 3 THEN 3
        ELSE 4
        END as level4, 
    
    original_table1.classes 
    , CASE original_table1.classes 
                                WHEN 1
                                THEN 1
                                WHEN 2
                                THEN 2
                                ELSE 3
                              END
    as luc, 
    count(original_table2.id) as count_no
    
    FROM original_table2
    LEFT JOIN original_table1
    ON original_table1.plot_id=original_table2.id
    WHERE original_table2.selected_for_field>0
    AND original_table1.reachability_2=2
    AND original_table1.classes IN (SELECT DISTINCT original_table1.classes
                           FROM original_table1)
    AND original_table2.level IN (SELECT DISTINCT original_table2.level
                           FROM original_table2)
    GROUP BY original_table2.level, original_table1.classes
    ORDER BY original_table2.level ASC) as inner_counts
    
    GROUP BY inner_counts.level4, inner_counts.luc,inner_counts.count_no
    ORDER BY inner_counts.level4 ASC
    

    enter image description here

2 个答案:

答案 0 :(得分:1)

我确信有更优雅的方法,但这应该会得到结果集。使用子查询中的案例转换子组中的值,然后转换为组。

create table #test
([Group] int, [SubGroup] int, [Count] int)

Insert into #test Values(1,1,175)
insert into #test values(1,2,5)
insert into #test values(1,3,29)
insert into #test values(1,4,116)
insert into #test values(1,5,5)
insert into #test values(1,6,4)
insert into #test values(1,7,8)
insert into #test values(1,8,5)
insert into #test values(1,9,479)
insert into #test values(2,1,12)
insert into #test values(2,2,33)
insert into #test values(2,3,147)
insert into #test values(2,4,6)
insert into #test values(2,5,5)
insert into #test values(2,6,38)
insert into #test values(2,7,440)
insert into #test values(2,8,67)
insert into #test values(2,9,110)
insert into #test values(3,1,256)
insert into #test values(3,2,7)
insert into #test values(3,3,17)
insert into #test values(3,4,8)
insert into #test values(3,5,428)
insert into #test values(3,6,23)
insert into #test values(3,7,26)
insert into #test values(3,8,78)
insert into #test values(3,9,1)
insert into #test values(4,1,81)
insert into #test values(4,2,425)
insert into #test values(4,3,129)
insert into #test values(4,4,327)
insert into #test values(4,5,455)
insert into #test values(4,6,126)
insert into #test values(4,7,48)
insert into #test values(4,8,287)
insert into #test values(4,9,363)
insert into #test values(5,1,239)
insert into #test values(5,2,93)
insert into #test values(5,3,373)
insert into #test values(5,4,53)
insert into #test values(5,5,109)
insert into #test values(5,6,126)
insert into #test values(5,7,419)
insert into #test values(5,8,214)
insert into #test values(5,9,342)
insert into #test values(6,1,104)
insert into #test values(6,2,437)
insert into #test values(6,3,356)
insert into #test values(6,4,337)
insert into #test values(6,5,6)
insert into #test values(6,6,388)
insert into #test values(6,7,172)
insert into #test values(5,8,280)
insert into #test values(5,9,349)
    Select 
    [Group],
    [SubGroup],
    CountNumeric = sum([Count])

From (
    Select 
        [Group],
        [SubGroup] = Case subgroup 
                            When 1
                            Then 1
                            WHen 2
                            Then 2
                            Else 3
                          End,
        [Count]
    From #test) a
Group By 
    [Group],
    [SubGroup]
Order by 1,2 asc

我的结果集是:

1   1   175
1   2   5
1   3   646
2   1   12
2   2   33
2   3   813
3   1   256
3   2   7
3   3   581
4   1   81
4   2   425
4   3   1735
5   1   239
5   2   93
5   3   2265
6   1   104
6   2   437
6   3   1259

这就是你要找的东西吗?

答案 1 :(得分:0)

查看OVER()PARTITION BY子句。这将允许您计算单独的汇总而不影响其余结果。