sql - How do I use the grouping clause in my select statement with grouping sets? -


i learned of using grouping sets clause , believe can re write 1 of old queries. currently, union of 5 different groupings coming cte. understand should able change different hierarchies being grouped grouping sets of rollup, need specify literal @ each level or grouping. can't show actual code, have example below.

select      b.level_one, b.level_two, b.level_three, b.level_four, b.level_five,     case         when (grouping(b.level_five)=1) ''         when ...         when ...         when ...         when ...         when ...     end as'level_type',     sum(b.value) total     base b     ... group grouping sets(     (b.level_one, b.level_two, b.level_three, b.level_four, b.level_five),     (b.level_one, b.level_two, b.level_three, b.level_four),     (b.level_one, b.level_two, b.level_three),     (b.level_one, b.level_two, b.level_four),     (b.level_one, b.level_two),     (b.level_one, b.level_two) ) 

this general idea of think want go. problem i'm having how specify literal when use either 3rd or 4th grouping set. ideas?

edit:

expected results rows following:

level_one | level_two | level_three | level_four | level_five | level_type | total  'lvl1'    | 'lvl2'    | 'lvl3'      | 'lvl4'     | 'lvl5'     | 'level 5'  | (int) ... 'lvl1'    | 'lvl2'    | 'lvl3'      | 'lvl4'     | null       | 'level 3,4'| (int) ... 'lvl1'    | 'lvl2'    | null       | 'lvl4'     | null       | 'level 4'  | (int) ... 'lvl1'    | 'lvl2'    | 'lvl3'      | null       | null       | 'level 3'  | (int) ... 'lvl1'    | 'lvl2'    | null       | null       | null       | 'level 2'  | (int) ... 'lvl1'    | null      | null        | null       | null       | 'level 1'  | (int) ... 

you'll more , better answers if include sql ddl , sample data. code below untested.

to better see what's going on, include column each grouping set.

select      b.level_one, b.level_two, b.level_three, b.level_four, b.level_five,     grouping(level_one)   grp_lvl1,     grouping(level_two)   grp_lvl2,     grouping(level_three) grp_lvl3,     grouping(level_four)  grp_lvl4,     grouping(level_five)  grp_lvl5,     sum(b.value) total     base b     ... group grouping sets(     (b.level_one, b.level_two, b.level_three, b.level_four, b.level_five),     (b.level_one, b.level_two, b.level_three, b.level_four),     (b.level_one, b.level_two, b.level_three),     (b.level_one, b.level_two, b.level_four),     (b.level_one, b.level_two),     (b.level_one, b.level_two) ); 

i'm not grouping sets wrote ones want. closely @ them.

once examine output of query, you'll able see how structure case...when expression. end looking something this.

(case when (grouping(level_one)   = 1) ,            (grouping(level_two)   = 1) ,            (grouping(level_three) = 1) ,             (grouping(level_four)  = 1) ,             (grouping(level_five)  = 1) 'some string literal here'       when (grouping(level_one)   = 0) ,            (grouping(level_two)   = 1) ,            (grouping(level_three) = 1) ,             (grouping(level_four)  = 1) ,             (grouping(level_five)  = 1) 'some other string literal here'       when ...  end) level_type 

Comments

Popular posts from this blog

linux - xterm copying to CLIPBOARD using copy-selection causes automatic updating of CLIPBOARD upon mouse selection -

c++ - qgraphicsview horizontal scrolling always has a vertical delta -