--- Em qui, 27/5/10, Gunther Furtado <[email protected]> escreveu:

> Olá,
> 
> Então, tinha eu 21 conjuntos de dados, são sete anos com
> três
> conjuntos recorrentes de informação bruta para cada
> ano,  referentes
> aos 399 municípios do Paraná. Criei, então, um arquivo
> de banco de
> dados do BrOffice 3.1 com as 21 tabelas.
> 
> Devido à pressa, criei 21 consultas para o subconjunto de
> municípios
> necessários e seus respectivos relatórios dos quais
> copiei e colei
> para a tabela que precisava gerar, que tinha na linha o
> anos, e, para
> cada ano, o número de ocorrências e a soma dos valores
> destas
> ocorrências e na coluna o somatório dos valores
> recorrentes. (em
> anexo)
> 
> Depois que entreguei o produto, voltei ao BD para tentar
> descobrir
> como fazer isto em uma consulta só, se possível. Tentei,
> primeiramente, criar uma consulta para um dos conjuntos de
> dados
> recorrentes para os municípios necessários e, mesmo sem
> qualquer
> reclamação quanto a sintaxe, o programa foi incapaz de
> gerar a
> consulta: sem aviso sem nada, ele consome 50% da cpu
> (Pentium 4 de
> 3,20GHz) e mesmo depois de 40 min tentando produzir
> resultado, nada
> acontece;
> 
> Achei que tinha feito alguma coisa errada e reduzi a
> consulta a um
> único município sem qualquer função com o mesmo
> resultado.
> 
> Os dados originais não podem ser publicados, portanto se
> eu não
> consegui ser claro, vou ter que fajutar os dados para
> mandar para a
> lista...
> 
> Eu nunca tinha tentado mexer com banco de dados (nem do
> Broo, nem
> qualquer outro) e há grandes chances de eu ter usado
> alguma estratégia
> errada na montagem do bd, se alguém tiver alguma
> indicação de leitura
> do tipo bds para iniciantes.
> 
> Outra coisa, levei o arquivo para casa e a mesmo resultado
> foi obtido
> no debian squeeze com o Go-oo.
> 
> Qualquer ajuda é benvinda,
> 


Caro Gunther;

Desconsiderando qualquer aspecto referente ao projeto do banco de dados (caso 
seja de seu interesse poderemos voltar a este ponto) considerarei, pelo que 
depreendi de sua explicação, que você construiu as seguintes tabelas:

Para cada setor (Primário, Secundário, Terciário) uma tabela para cada ano 
(2003 a 2009) - total de 21 tabelas - e cada uma destas tabelas possui os 
atributos (município, ord, valor, e possíveis outros atributos). Para cada 
município existem diversas linhas com diferentes ord e valor e o que se deseja 
é a quantidade de linhas e valor total de cada município.

A sentença SQL:
SELECT municipio, count(ord), sum(valor) FROM tab_prim_2003 GROUP BY municipio 
ORDER BY municipio;
fornecerá para cada município a quantidade e o valor total para o setor 
primário no exercício 2003.

Para obter todos os exercícios podemos usar uma junção:
SELECT p03.municipio, count(p03.ord) AS n_prim_2003, sum(p03.valor) AS 
val_prim_2003, 
                      count(p04.ord) AS n_prim_2004, sum(p04.valor) AS 
val_prim_2004,
                      count(p05.ord) AS n_prim_2005, sum(p05.valor) AS 
val_prim_2005,
                      count(p06.ord) AS n_prim_2006, sum(p06.valor) AS 
val_prim_2006,
                      count(p07.ord) AS n_prim_2007, sum(p07.valor) AS 
val_prim_2007,
                      count(p08.ord) AS n_prim_2008, sum(p08.valor) AS 
val_prim_2008,
                      count(p09.ord) AS n_prim_2009, sum(p09.valor) AS 
val_prim_2009
   FROM tab_prim_2003 p03 JOIN tab_prim_2004 p04 ON p03.municipio = 
p04.municipio 
                          JOIN tab_prim_2005 p05 ON p03.municipio = 
p05.municipio
                          JOIN tab_prim_2006 p06 ON p03.municipio = 
p06.municipio
                          JOIN tab_prim_2007 p07 ON p03.municipio = 
p07.municipio
                          JOIN tab_prim_2008 p08 ON p03.municipio = 
p08.municipio
                          JOIN tab_prim_2009 p09 ON p03.municipio = 
p09.municipio
GROUP BY municipio ORDER BY municipio;

Idem para os setores Secundário e Terciário.

Para obter a tabela desejada faça a união das 3 consultas:
SELECT p03.municipio, 'Primário' AS setor,
                      count(p03.ord) AS n_pri_2003, sum(p03.valor) AS 
val_pri_2003, 
                      ...
                      count(p09.ord) AS n_pri_2009, sum(p09.valor) AS 
val_pri_2009
   FROM tab_pri_2003 p03 JOIN tab_prim_2004 p04 ON p03.municipio = 
p04.municipio 
                          ...
                         JOIN tab_prim_2009 p09 ON p03.municipio = p09.municipio
GROUP BY p03.municipio
UNION ALL
SELECT s03.municipio, 'Secundário' AS setor,
                      count(s03.ord) AS n_sec_2003, sum(s03.valor) AS 
val_sec_2003, 
                      ...
                      count(s09.ord) AS n_sec_2009, sum(s09.valor) AS 
val_sec_2009
   FROM tab_sec_2003 s03 JOIN tab_sec_2004 s04 ON s03.municipio = s04.municipio 
                          ...
                         JOIN tab_sec_2009 p09 ON s03.municipio = s09.municipio
GROUP BY s03.municipio
UNION ALL
SELECT t03.municipio, 'Terciário' AS setor,
                      count(t03.ord) AS n_ter_2003, sum(t03.valor) AS 
val_ter_2003, 
                      ...
                      count(t09.ord) AS n_ter_2009, sum(t09.valor) AS 
val_ter_2009
   FROM tab_ter_2003 t03 JOIN tab_ter_2004 t04 ON t03.municipio = t04.municipio 
                          ...
                         JOIN tab_ter_2009 t09 ON t03.municipio = t09.municipio
GROUP BY municipio
ORDER BY municipio, setor;

A ideia é essa. Como não testei pode haver algum erro de digitação.

Osvaldo






---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Responder a