--- 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]