Sql ,Agrupar por dia mais preciso mostrar todos os dias !

Firebird

14/05/2008

Pessoal, preciso de um relatório de vendas agrupado por dia
estou usando assim
SELECT
PLANO_PAGAMENTO,
DATA,
SUM ( VALOR ) AS TOTAL
WHERE DATA >= 01/04/2008 AND DATA <= 29/04/2008
GROUP BY PLANO_PAGAMENTO,DATA
Só que ele só mostra o que dia em que teve vendo, gostaria de que no dia que naum estivesse mostrasse zero
ex:
data 01/04/2008 valor 30,00
data 02/04/2008 valor 0,00
mostrasse tbm zero nos dias que naum tivessem valor de venda
tem como ?
Obrigado a tds


Essistemas

Essistemas

Curtidas 0

Respostas

Martins

Martins

14/05/2008

Pessoal, preciso de um relatório de vendas agrupado por dia estou usando assim SELECT PLANO_PAGAMENTO, DATA, SUM ( VALOR ) AS TOTAL WHERE DATA >= 01/04/2008 AND DATA <= 29/04/2008 GROUP BY PLANO_PAGAMENTO,DATA Só que ele só mostra o que dia em que teve vendo, gostaria de que no dia que naum estivesse mostrasse zero ex: data 01/04/2008 valor 30,00 data 02/04/2008 valor 0,00 mostrasse tbm zero nos dias que naum tivessem valor de venda tem como ? Obrigado a tds


Vc já tentou criar uma Stored Procedure para resolver essa questão?

Acredito que com ela vc pode ter o resultado esperado. Infelizmente não tenho como testar ou postar nada no momento.

Boa sorte e bons códigos.


GOSTEI 0
Paulo

Paulo

14/05/2008

Qual banco vc está usando? Se for fireBird tente assim:
SELECT PLANO_PAGAMENTO, DATA, SUM (COALESCE( VALOR,0) ) AS TOTAL WHERE DATA >= 01/04/2008 AND DATA <= 29/04/2008 GROUP BY PLANO_PAGAMENTO,DATA

Desta forma caso venha um NULL(Por isso não está mostrando no seu), ele atribui um valor 0 para ele. Se for SqlServer faça:
SELECT PLANO_PAGAMENTO, DATA, SUM (ISNULL(VALOR,0) ) AS TOTAL WHERE DATA >= 01/04/2008 AND DATA <= 29/04/2008 GROUP BY PLANO_PAGAMENTO,DATA

Tente e poste o resultado.


GOSTEI 0
Emersonalexandre

Emersonalexandre

14/05/2008

A questão não é o lance do null, o problema pode ser resolvido com uma tabela auxiliar que tem todos os dias do ano ou uma Stored Procedure que crie esta tabela com as datas temporariamente para você ter o que precisa.
Outra forma é fazer via código usando um FOR.


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

14/05/2008

creio que a melhor solução seja mesmo com stored procedure.

CREATE PROCEDURE VENDAS_POR_DIA (
    DATAINICIAL DATE,
    DATAFINAL DATE)
RETURNS (
    PLANO INTEGER, -- não sei o tipo do campo, deixei integer...
    DATA DATE,
    VALOR DOUBLE PRECISION)
AS
begin
  data = datainicial;

  while (data <= datafinal) do
  begin
    for
      SELECT
        COALESCE(PLANO_PAGAMENTO,0),
        COALESCE(SUM(VALOR),0)
      FROM
        SUA_TABELA
      WHERE
        DATA = :Data
      GROUP BY
        PLANO_PAGAMENTO
      INTO :plano, :valor
    do
      suspend;

    data = data + 1;
  end
end

daí basta usar, assim:
select * from vendas_por_dia(´01.04.2008´, ´29/04/2008´)

notei que você agrupou pelo campo [i:57d6ac3be8]plano_pagamento[/i:57d6ac3be8], mas não mostra o valor desse campo no seu exemplo. esse campo é realmente necessário?

[color=blue:57d6ac3be8][b:57d6ac3be8]essa stored procedure funciona no Firebird.[/b:57d6ac3be8][/color:57d6ac3be8]

[size=18:57d6ac3be8]informe o banco de dados utilizado para que possamos dar respostas mais precisas.[/size:57d6ac3be8]


GOSTEI 0
Essistemas

Essistemas

14/05/2008

Emerson e os colegas muito obrigado pela ajuda !.

Estou usando Feribird.
Bom esse plano_pagamento é varchar(30)
e a descricao como foi pago CARTAO, DINHEIRO ETC !

esse relatorio teria que ficar assim Ex :

01/02/2008 CARTAO 0,00 DINHEIRO 20,00
02/022008 CARTAO 0,00 DINHEIRO 0,00
Valeu !!


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

14/05/2008

você tem um tabela com as formas de pagamento?


GOSTEI 0
Essistemas

Essistemas

14/05/2008

Vou te passar as estrutura
CREATE TABLE ´MOVICAIXA´
(
´NR_FORMAREC´ INTEGER NOT NULL,
´FCODPLANO´ INTEGER NOT NULL,
´FNR_CUPOM´ VARCHAR(10) NOT NULL,
´VALOR´ NUMERIC(15,2) NOT NULL,
´CODTIPO´ INTEGER NOT NULL,
´NRREGPDV´ INTEGER,
´CODCOND´ INTEGER,
´CODCLI´ INTEGER,
´CODCONV´ INTEGER,
CONSTRAINT ´PK_FORMAREC´ PRIMARY KEY (´NR_FORMAREC´)
);



CREATE TABLE ´PLANO´
(
´CODIGO´ INTEGER NOT NULL,
´PLANO_PAGAMENTO´ VARCHAR(40) NOT NULL,
´VEZES´ DOUBLE PRECISION,
´JUROS´ DOUBLE PRECISION,
´STATUS´ VARCHAR(10),
´CADASTRO´ TIMESTAMP,
´ALTERACAO´ TIMESTAMP,
´CONFIRMAVENC´ VARCHAR(5),
´PROMISSORIA´ VARCHAR(5),
´TIPO´ VARCHAR(1),
´INDICE´ VARCHAR(1),
´TFECHAMENTO´ VARCHAR(30),
´NATURAL´ VARCHAR(1),
´PARCELAS´ VARCHAR(30),
´GERARCONTA´ VARCHAR(1),
´TAXACAD´ DOUBLE PRECISION,
´ID_LOJA´ INTEGER,
´BLQDESC´ VARCHAR(6),
´BLQDESCPRM´ VARCHAR(6),
´SENHA´ VARCHAR(6),
CONSTRAINT ´PK_PLANO´ PRIMARY KEY (´CODIGO´)
);
faco um LEFT OUTER JOIN FCODPLANO com Codigo da tabela plano.
Estou usando COM+ o sistema é 3 Camadas.
Obrigado pela ajuda !.


GOSTEI 0
Essistemas

Essistemas

14/05/2008

baseado no seu exemplo creiei ess SP
mais só me retorna o primeiro dia
ex 16/05/2008 a 19/05/2008

o que pode estar errado ?

SET TERM ^ ;

CREATE PROCEDURE ´VENDAS DIA´ (
DATAINI DATE,
DATAFIM DATE)
RETURNS (
TIPO VARCHAR(20),
VALOR DOUBLE PRECISION,
BANDEIRA VARCHAR(30),
DATAVDA DATE,
PLANO VARCHAR(30))
AS
DECLARE VARIABLE DATA DATE;
begin
data = DataINI;
while (data <= DataFIM) do
begin
for
SELECT
M.DATA,
COALESCE(SUM(FR.VALOR),0),
T.TIPO_VENDA,
B.DESCRBANDEIRA,
PL.PLANO_PAGAMENTO
FROM MOVICAIXA M
LEFT OUTER JOIN FORMAREC FR ON M.NR_CUPOM = FR.FNR_CUPOM
LEFT OUTER JOIN TIPOVENDA T ON T.CODTIPO = FR.CODTIPO
LEFT OUTER JOIN TAB_BANDEIRAS B ON M.CODBAN = B.CODBAN
LEFT OUTER JOIN PLANO PL ON FR.FCODPLANO = PL.CODIGO

WHERE
M.DATA = :Data
GROUP BY m.data , tipo_venda,B.descrbandeira,PL.plano_pagamento
INTO :datavda, :valor, :Tipo ,:bandeira ,:plano

do
suspend;
data = data + 1;
end


end
^

SET TERM ; ^

GRANT SELECT ON MOVICAIXA TO PROCEDURE ´VENDAS DIA´;

GRANT SELECT ON FORMAREC TO PROCEDURE ´VENDAS DIA´;

GRANT SELECT ON TIPOVENDA TO PROCEDURE ´VENDAS DIA´;

GRANT SELECT ON TAB_BANDEIRAS TO PROCEDURE ´VENDAS DIA´;

GRANT SELECT ON PLANO TO PROCEDURE ´VENDAS DIA´;

GRANT EXECUTE ON PROCEDURE ´VENDAS DIA´ TO SYSDBA;


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

14/05/2008

tente assim:

CREATE PROCEDURE "VENDAS DIA" (
  DATAINI DATE,
  DATAFIM DATE)
RETURNS (
  TIPO VARCHAR(20),
  VALOR DOUBLE PRECISION,
  BANDEIRA VARCHAR(30),
  DATA DATE,
  PLANO VARCHAR(30))
AS
begin
  data = DataINI;

  while (data <= DataFIM) do
  begin
    for
      SELECT
        COALESCE(SUM(FR.VALOR),0),
        T.TIPO_VENDA,
        B.DESCRBANDEIRA,
        PL.PLANO_PAGAMENTO
      FROM
        PLANO PL
      LEFT JOIN
        MOVICAIXA M ON M.FCODPLANO = PL.CODIGO AND M.DATA = :DATA
      LEFT JOIN
        FORMAREC FR ON FR.FNR_CUPOM = M.NR_CUPOM AND FR.FCODPLANO = PL.CODIGO
      LEFT JOIN
        TIPOVENDA T ON T.CODTIPO = FR.CODTIPO
      LEFT JOIN
        TAB_BANDEIRAS B ON B.CODBAN = M.CODBAN
      GROUP BY
        T.TIPO_VENDA, B.DESCRBANDEIRA, PL.PLANO_PAGAMENTO
      INTO
        :valor, :Tipo, :Bandeira, :Plano
    do
      suspend;

    data = data + 1;
  end
end



GOSTEI 0
Essistemas

Essistemas

14/05/2008

Emerson deu certo naum
LEFT JOIN
MOVICAIXA M ON M.FCODPLANO = PL.CODIGO AND M.DATA = :DATA
LEFT JOIN
FORMAREC FR ON FR.FNR_CUPOM = M.NR_CUPOM AND FR.FCODPLANO = PL.CODIGO
LEFT JOIN
TIPOVENDA T ON T.CODTIPO = FR.CODTIPO
LEFT JOIN
FCODPLANO esta na tabela FORMAREC vou passar minhas strutura pra vc da uma olhada

MOVICAIXA= Tabela com Registro de Caixa
ID_LOJA INTEGER NOT NULL,
CODTIPO INTEGER NOT NULL,
CODFUNC INTEGER NOT NULL,
CODBAN INTEGER,
NR_REGISTRO INTEGER NOT NULL,
CODIGOCLI INTEGER,
DATA TIMESTAMP,
HORA VARCHAR(8),
NRCAIXA VARCHAR(2),
DIASEMANA VARCHAR(16),
SITUACAO VARCHAR(6),
DESCONTO DOUBLE PRECISION,
NR_CUPOM VARCHAR(10) NOT NULL,
CPF VARCHAR(15)

FORMAREC = Forma que foi VENDIDO ,PLANO ,VALOR ETC
NR_FORMAREC INTEGER NOT NULL,
FCODPLANO INTEGER NOT NULL,
FNR_CUPOM VARCHAR(10) NOT NULL,
VALOR NUMERIC(15,2) NOT NULL,
CODTIPO INTEGER NOT NULL,
NRREGPDV INTEGER,
CODCOND INTEGER,
CODCLI INTEGER,
CODCONV INTEGER

TIPO VENDA - Se é a Vista ou Pazo,convenio e etc
CODTIPO INTEGER NOT NULL,
TIPO_VENDA VARCHAR(20)

TABELA PLANO- Com os Planos de Pagamentos
CODIGO INTEGER NOT NULL,
PLANO_PAGAMENTO VARCHAR(40) NOT NULL,
VEZES DOUBLE PRECISION,
JUROS DOUBLE PRECISION,
STATUS VARCHAR(10),
CADASTRO TIMESTAMP,
Faço uma junção das tres tabelas para ter um resultado assim ex:
NR_CUPOM VALOR TIPO PLANO_PAGAMENTO etc !
000121 22,00 VENDA A VISTA DINHEIRO
04545 44,00 VENDA A PRAZO 30 DIAS
ETC !


GOSTEI 0
POSTAR