Re: [pgbr-geral] Criar função no postgreSQL
2014-05-21 16:27 GMT-03:00 Pedro B. Alves pedroalve...@gmail.com: CREATE OR REPLACE FUNCTION pedidos_mes(dt_ini date, dt_fim date) RETURNS TABLE(month integer, year integer, count integer) LANGUAGE SQL AS $$ SELECT mes, ano, sum(count) FROM ( SELECT EXTRACT(MONTH FROM datapedido) AS mes, EXTRACT(YEAR FROM datapedido) AS ano, COUNT(id) AS count FROM pedidos WHERE datapedido BETWEEN dt_ini AND dt_fim GROUP BY ano, mes UNION ALL SELECT EXTRACT(MONTH FROM dt), EXTRACT(YEAR FROM dt), 0 FROM generate_series(date_trunc('month', dt_ini), date_trunc('month', dt_fim), interval '1 month'); ) t ORDER BY ano, mes GROUP BY ano, mes $$; Dessa forma você pega tudo disponível na tabela e usa o generate_series para gerar as datas (nesse caso primeiro dia de cada mês) que não estão lá. Acredito ser isso. Vou testar aqui. a função está me retornando um RECORD (1,2014,0) (2,2014,0) (3,2014,0) (4,2014,3) (5,2014,0) Sabes como resolver isso? ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Criar função no postgreSQL
Em 22 de maio de 2014 11:55, Pedro B. Alves pedroalve...@gmail.comescreveu: 2014-05-21 16:27 GMT-03:00 Pedro B. Alves pedroalve...@gmail.com: CREATE OR REPLACE FUNCTION pedidos_mes(dt_ini date, dt_fim date) RETURNS TABLE(month integer, year integer, count integer) LANGUAGE SQL AS $$ SELECT mes, ano, sum(count) FROM ( SELECT EXTRACT(MONTH FROM datapedido) AS mes, EXTRACT(YEAR FROM datapedido) AS ano, COUNT(id) AS count FROM pedidos WHERE datapedido BETWEEN dt_ini AND dt_fim GROUP BY ano, mes UNION ALL SELECT EXTRACT(MONTH FROM dt), EXTRACT(YEAR FROM dt), 0 FROM generate_series(date_trunc('month', dt_ini), date_trunc('month', dt_fim), interval '1 month'); ) t ORDER BY ano, mes GROUP BY ano, mes $$; Dessa forma você pega tudo disponível na tabela e usa o generate_series para gerar as datas (nesse caso primeiro dia de cada mês) que não estão lá. Acredito ser isso. Vou testar aqui. a função está me retornando um RECORD (1,2014,0) (2,2014,0) (3,2014,0) (4,2014,3) (5,2014,0) Sabes como resolver isso? serial algo assim: select mes, ano, count from pedidos_mes('2014-01-01', '2014-05-01') t ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Criar função no postgreSQL
On Thu, May 22, 2014 at 11:57 AM, Pedro B. Alves pedroalve...@gmail.com wrote: serial algo assim: select mes, ano, count from pedidos_mes('2014-01-01', '2014-05-01') t No caso da sua função será: select month, year, count from pedidos_mes('2014-01-01', '2014-05-01') Bruno E. A. Silva. Analista de Sistemas. Bacharel em Sistemas de Informação MBA Gerência de Projetos Certified Scrum Master LPIC-1 SCJP, SE 6 Novell CLA / DCTS ECR DBA Postgres --- “A caixa dizia: Requer MS Windows ou superior. Então instalei Linux.” - Sábio Desconhecido Alguns prestam serviço/consultoria de Qualidade, os outros vendem licença! ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Criar função no postgreSQL
2014-05-21 16:52 GMT-03:00 veronica almeida veronika.alessan...@gmail.com: Perdão... na função do Matheus já faz a soma!! Sorry! Sim... Essa é a sacadinha... ;-) Atenciosamente, -- Matheus de Oliveira Analista de Banco de Dados Dextra Sistemas - MPS.Br nível F! www.dextra.com.br/postgres ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Criar função no postgreSQL
2014-05-21 10:32 GMT-03:00 Pedro B. Alves pedroalve...@gmail.com: Preciso criar tipo uma tabela temporária dentro de uma função, para mim montar o retorno dela. por exemplo: ano | mes | pedidos 2014 | 01 | 0 2014 | 02 | 5 2014 | 03 | 0 2014 | 04 | 2 2014 | 05 | 0 nos meses que tem o valor 0 ZERO, não tem registro na tabela de pedidos. e eu gostaria de montar uma função que já me retorna-se desta forma. Qual a estrutura da tabela? Bruno E. A. Silva. Analista de Sistemas. ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Criar função no postgreSQL
Qual a estrutura da tabela? PEDIDOS ID DATAPEDIDO IDCLIENTE ... ... Estou fazendo assim: SELECT EXTRACT(MONTH FROM datapedido) as mes, EXTRACT(YEAR FROM datapedido), COUNT(id) FROM pedidos só que os meses que não possui pedidos ele não traz registro. ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Criar função no postgreSQL
Oi, Pedro! Se tiver uma tabela com datas, uma dimensão de tempo (com data, ano, mes), por exemplo, pode fazer algo assim: SELECT dim_tempo.mes, dim_tempo.ano, COUNT(pedidos.id) FROM dim_tempo LEFT JOIN pedidos ON dim_tempo.data = pedidos.datapedido GROUP BY dim_tempo.mes, dim_tempo.ano Em 21 de maio de 2014 10:48, Pedro B. Alves pedroalve...@gmail.comescreveu: Qual a estrutura da tabela? PEDIDOS ID DATAPEDIDO IDCLIENTE ... ... Estou fazendo assim: SELECT EXTRACT(MONTH FROM datapedido) as mes, EXTRACT(YEAR FROM datapedido), COUNT(id) FROM pedidos só que os meses que não possui pedidos ele não traz registro. ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Criar função no postgreSQL
Em 21/05/14, Pedro B. Alvespedroalve...@gmail.com escreveu: Bom dia Pessoal. Gostaria de um auxilio de vocês, se possivel. Preciso criar tipo uma tabela temporária dentro de uma função, para mim montar o retorno dela. por exemplo: ano | mes | pedidos 2014 | 01 | 0 2014 | 02 | 5 2014 | 03 | 0 2014 | 04 | 2 2014 | 05 | 0 nos meses que tem o valor 0 ZERO, não tem registro na tabela de pedidos. e eu gostaria de montar uma função que já me retorna-se desta forma. Se o problema for transformar NULL em 0 utilize a função coalesce. Se o problema for a existência de ano/mês nos períodos em que não existe pedidos então utilize LEFT OUTER JOIN com uma tabela de ano/mês. Osvaldo ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Criar função no postgreSQL
2014-05-21 10:48 GMT-03:00 Pedro B. Alves pedroalve...@gmail.com: Estou fazendo assim: SELECT EXTRACT(MONTH FROM datapedido) as mes, EXTRACT(YEAR FROM datapedido), COUNT(id) FROM pedidos só que os meses que não possui pedidos ele não traz registro. Você pode fazer da seguinte forma: CREATE OR REPLACE FUNCTION pedidos_mes(dt_ini date, dt_fim date) RETURNS TABLE(month integer, year integer, count integer) LANGUAGE SQL AS $$ SELECT mes, ano, sum(count) FROM ( SELECT EXTRACT(MONTH FROM datapedido) AS mes, EXTRACT(YEAR FROM datapedido) AS ano, COUNT(id) AS count FROM pedidos WHERE datapedido BETWEEN dt_ini AND dt_fim GROUP BY ano, mes UNION ALL SELECT EXTRACT(MONTH FROM dt), EXTRACT(YEAR FROM dt), 0 FROM generate_series(date_trunc('month', dt_ini), date_trunc('month', dt_fim), interval '1 month'); ) t ORDER BY ano, mes GROUP BY ano, mes $$; Dessa forma você pega tudo disponível na tabela e usa o generate_series para gerar as datas (nesse caso primeiro dia de cada mês) que não estão lá. Atenciosamente, -- Matheus de Oliveira Analista de Banco de Dados Dextra Sistemas - MPS.Br nível F! www.dextra.com.br/postgres ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Criar função no postgreSQL
Em 21 de maio de 2014 11:11, veronica almeida veronika.alessan...@gmail.com escreveu: Oi, Pedro! Se tiver uma tabela com datas, uma dimensão de tempo (com data, ano, mes), por exemplo, pode fazer algo assim: SELECT dim_tempo.mes, dim_tempo.ano, COUNT(pedidos.id) FROM dim_tempo LEFT JOIN pedidos ON dim_tempo.data = pedidos.datapedido GROUP BY dim_tempo.mes, dim_tempo.ano O problema não é a relação e sim os meses que não tem pedido. Por exemplo: quero os pedidos de Janeiro a Maio. Os meses que não tiverem pedidos, não vai trazer na relação, por isso preciso algo que cria esses meses. ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Criar função no postgreSQL
CREATE OR REPLACE FUNCTION pedidos_mes(dt_ini date, dt_fim date) RETURNS TABLE(month integer, year integer, count integer) LANGUAGE SQL AS $$ SELECT mes, ano, sum(count) FROM ( SELECT EXTRACT(MONTH FROM datapedido) AS mes, EXTRACT(YEAR FROM datapedido) AS ano, COUNT(id) AS count FROM pedidos WHERE datapedido BETWEEN dt_ini AND dt_fim GROUP BY ano, mes UNION ALL SELECT EXTRACT(MONTH FROM dt), EXTRACT(YEAR FROM dt), 0 FROM generate_series(date_trunc('month', dt_ini), date_trunc('month', dt_fim), interval '1 month'); ) t ORDER BY ano, mes GROUP BY ano, mes $$; Dessa forma você pega tudo disponível na tabela e usa o generate_series para gerar as datas (nesse caso primeiro dia de cada mês) que não estão lá. Acredito ser isso. Vou testar aqui. ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Criar função no postgreSQL
Em 21 de maio de 2014 16:23, Pedro B. Alves pedroalve...@gmail.comescreveu: Em 21 de maio de 2014 11:11, veronica almeida veronika.alessan...@gmail.com escreveu: Oi, Pedro! Se tiver uma tabela com datas, uma dimensão de tempo (com data, ano, mes), por exemplo, pode fazer algo assim: SELECT dim_tempo.mes, dim_tempo.ano, COUNT(pedidos.id) FROM dim_tempo LEFT JOIN pedidos ON dim_tempo.data = pedidos.datapedido GROUP BY dim_tempo.mes, dim_tempo.ano O problema não é a relação e sim os meses que não tem pedido. Por exemplo: quero os pedidos de Janeiro a Maio. Os meses que não tiverem pedidos, não vai trazer na relação, por isso preciso algo que cria esses meses. A tabela dim_tempo irá conter esses meses, seria uma tabela completa (de tal ano até tal ano dependendo da necessidade), sem buracos nas datas. Geralmente é utilizada em DW como a dimensão de tempo. O que o Matheus mandou irá retornar linhas duplicadas e não entendi de onde vem o dt Mais ou menos isso, quando digo linhas duplicadas: SELECT 05 as mes, 2014 as ano, 10 as qtd UNION ALL SELECT 05, 2014, 0 5;2014;10 5;2014;0 Como o Renato mandou elimina a duplicidade: SELECT mes, ano, SUM (qtd) as qtd FROM ( SELECT 05 as mes, 2014 as ano, 10 as qtd UNION ALL SELECT 05, 2014, 0) as pedidos GROUP BY mes, ano 5;2014;10 Não conhecia o generate_series... Valeu Matheus pela dica!! (-: ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Criar função no postgreSQL
Em 21 de maio de 2014 16:44, veronica almeida veronika.alessan...@gmail.com escreveu: Em 21 de maio de 2014 16:23, Pedro B. Alves pedroalve...@gmail.comescreveu: Em 21 de maio de 2014 11:11, veronica almeida veronika.alessan...@gmail.com escreveu: Oi, Pedro! Se tiver uma tabela com datas, uma dimensão de tempo (com data, ano, mes), por exemplo, pode fazer algo assim: SELECT dim_tempo.mes, dim_tempo.ano, COUNT(pedidos.id) FROM dim_tempo LEFT JOIN pedidos ON dim_tempo.data = pedidos.datapedido GROUP BY dim_tempo.mes, dim_tempo.ano O problema não é a relação e sim os meses que não tem pedido. Por exemplo: quero os pedidos de Janeiro a Maio. Os meses que não tiverem pedidos, não vai trazer na relação, por isso preciso algo que cria esses meses. A tabela dim_tempo irá conter esses meses, seria uma tabela completa (de tal ano até tal ano dependendo da necessidade), sem buracos nas datas. Geralmente é utilizada em DW como a dimensão de tempo. O que o Matheus mandou irá retornar linhas duplicadas e não entendi de onde vem o dt Mais ou menos isso, quando digo linhas duplicadas: SELECT 05 as mes, 2014 as ano, 10 as qtd UNION ALL SELECT 05, 2014, 0 5;2014;10 5;2014;0 Como o Renato mandou elimina a duplicidade: SELECT mes, ano, SUM (qtd) as qtd FROM ( SELECT 05 as mes, 2014 as ano, 10 as qtd UNION ALL SELECT 05, 2014, 0) as pedidos GROUP BY mes, ano 5;2014;10 Não conhecia o generate_series... Valeu Matheus pela dica!! (-: Perdão... na função do Matheus já faz a soma!! Sorry! ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral