2017-01-25 17 views
2

Есть ли способ назвать группировки? Для каждого набора групп (явно заданного или сгенерированного с помощью rollup или куба в соответствии с https://www.postgresql.org/docs/devel/static/queries-table-expressions.html) я хотел бы как-то указать имя в столбце результата. Вот некрасиво мгновенный демо того, что я пытаюсь сделать, с именем просто быть список сгруппированных колонок:postgresql, названные группировки?

select *, array_to_string(array_remove(array[case when "A" is null then null else 'A' end, 
              case when "B" is null then null else 'B' end, 
              case when "C" is null then null else 'C' end 
              ],null),',') as grouping_set 
from (values ('a','b','c'), 
       ('aa','bb','cc'), 
       ('aaa',null,'ccc')) as foo("A","B","C") 
group by rollup(1,2,3); 


    A | B | C | grouping_set 
-----+----+-----+-------------- 
a | b | c | A,B,C 
a | b |  | A,B 
a | |  | A 
aa | bb | cc | A,B,C 
aa | bb |  | A,B 
aa | |  | A 
aaa | | ccc | A,C <--------- should be A,B,C 
aaa | |  | A  <--------- should be A,B 
aaa | |  | A 
    | |  | 

Но обратите внимание, что есть проблема с двумя рядами, помечены стрелками: оба из них включают столбец B в группировке, но не в имени, потому что B является нулевым в этих группах.

Любые идеи или лучшие способы обойти это?

ответ

2
SELECT "A", "B", "C", 
     CASE GROUPING("A", "B", "C") 
      WHEN 0 THEN 'A,B,C' 
      WHEN 1 THEN 'A,B' 
      WHEN 3 THEN 'A' 
      ELSE '' 
     END AS grouping_set 
FROM (VALUES ('a','b','c'), 
      ('aa','bb','cc'), 
      ('aaa',null,'ccc') 
    ) AS foo("A","B","C") 
GROUP BY ROLLUP(1,2,3); 

Relevant documentation on grouping sets согласно Clodoaldo Neto «s ответ.

1

Grouping Operations

операции Группировка используются в сочетании с группировкой множеств (см раздел 7.2.4), чтобы отличить строки результата. Аргументы операции GROUPING на самом деле не оцениваются, но они должны точно соответствовать выражениям, приведенным в предложении GROUP BY соответствующего уровня запросов. Биты назначаются самым правым аргументом, являющимся наименее значимым битом; каждый бит равен 0, если соответствующее выражение включено в критерии группировки набора группировки, генерирующего строку результата, и 1, если это не так.

select *, grouping("A","B","C") as grouping_set 
from (values 
    ('a','b','c'), 
    ('aa','bb','cc'), 
    ('aaa',null,'ccc') 
) as foo("A","B","C") 
group by rollup(1,2,3); 
    A | B | C | grouping_set 
-----+----+-----+-------------- 
a | b | c |   0 
a | b |  |   1 
a | |  |   3 
aa | bb | cc |   0 
aa | bb |  |   1 
aa | |  |   3 
aaa | | ccc |   0 
aaa | |  |   1 
aaa | |  |   3 
    | |  |   7 
+0

ответ Лоренц сделал его в течение нескольких секунд, прежде чем ваша, так что я выбрал его, но это здорово, и имеет ссылку на документацию, которая может быть полезна, потому что «группировка» не простая вещь, чтобы Google на. – Sigfried

Смежные вопросы