Pergunta

Estou tentando criar um relatório que contenha um resumo de cada grupo.Por exemplo:

ID           NAME              COUNT           TOTAL     TYPE
-------------------------------------------------------------
1            Test 1            10                         A
2            Test 2            8                          A
                                               18

7            Mr. Test          9                          B
12           XYZ               4                          B
                                               13

25           ABC               3                          C
26           DEF               5                          C
19           GHIJK             1                          C
                                               9

Tenho uma consulta que pode fazer tudo menos as colunas TOTAL:

       select sd.id DATA_REF_NUM ID, count(sd.DATA_DEF_ID) COUNT, defs.data_name NAME, sd.type
       from some_data sd, data_defs defs
       where sd.data_def_id = defs.data_def_id
       group by some_data.type, some_data.id, defs.data_nam
       order by some_data.id asc, count(amv.MSG_ID) desc ;

Só não sei como obter um resumo de um grupo.Neste caso, estou tentando obter uma soma de COUNT para cada grupo de ID.

ATUALIZAR:

Os grupos são por tipo.Esqueci isso no post original.

TOTAL é SUM(COUNT) para cada grupo.

Foi útil?

Solução

Que tal usar o Rollup como ...

select sd.id DATA_REF_NUM ID, count(sd.DATA_DEF_ID) COUNT, defs.data_name NAME, sd.type from some_data sd, data_defs defs where sd.data_def_id = defs.data_def_id group by ROLLUP(some_data.type, (some_data.id, defs.data_nam)) order by some_data.id asc, count(amv.MSG_ID) desc ;

Isso funciona para um exemplo semelhante no meu banco de dados, mas eu só fiz isso em duas colunas, não tenho certeza de como ele funcionará mais ...
Espero que isso seja útil,
Craig ...

EDIT: Em um rollup, as colunas que você deseja resumir, mas não subtotal, como id e data_nam devem ser agrupadas dentro do rollup em paranteses)

Outras dicas

Assumindo o SQL*Plus, você poderia fazer algo assim:

col d1 noprint
col d2 noprint
WITH q AS
(SELECT sd.id, count(sd.DATA_DEF_ID) COUNT, defs.data_name NAME, sd.type
   FROM some_data sd JOIN data_defs defs ON (sd.data_def_id = defs.data_def_id)
  GROUP BY some_data.type, some_data.id, defs.data_nam)
SELECT 1 d1, type d2, id, count, name FROM q
UNION ALL
SELECT 2, type, null, null, null, SUM(count) FROM q GROUP BY 2, type
 ORDER BY 2,1,3;

Não consigo fazer isso funcionar no PL/SQL Developer 8, apenas no SQL*Plus.Nem mesmo a janela de comando funcionará...

Experimente uma subconeração que retorne a contagem de todos os itens do tipo. Isso seria

select sd.id DATA_REF_NUM ID, count(sd.DATA_DEF_ID) COUNT, tot.TOTAL_FOR_TYPE, defs.data_name NAME, sd.type
   from some_data sd, data_defs defs, 
      (select count(sd2.DATA_DEF_ID) TOTAL_FOR_TYPE 
       from some_data sd2
       where sd2.type = sd.type) tot
   where sd.data_def_id = defs.data_def_id
   group by some_data.type, some_data.id, defs.data_nam
   order by some_data.id asc, count(amv.MSG_ID) desc ;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top