Re: [pgbr-geral] Criar função no postgreSQL

2014-05-22 Por tôpico Pedro B. Alves
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

2014-05-22 Por tôpico Pedro B. Alves
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

2014-05-22 Por tôpico Bruno Silva
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-22 Por tôpico Matheus de Oliveira
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 Por tôpico Bruno Silva
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

2014-05-21 Por tôpico Pedro B. Alves

 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

2014-05-21 Por tôpico veronica almeida
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

2014-05-21 Por tôpico Osvaldo Kussama
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 Por tôpico Matheus de Oliveira
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

2014-05-21 Por tôpico Pedro B. Alves
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

2014-05-21 Por tôpico Pedro B. Alves


 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

2014-05-21 Por tôpico veronica almeida
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

2014-05-21 Por tôpico veronica almeida
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