Fórum Sql ,Agrupar por dia mais preciso mostrar todos os dias ! #59736
14/05/2008
0
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
Curtir tópico
+ 0Posts
14/05/2008
Martins
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
14/05/2008
Paulo
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:
Tente e poste o resultado.
Gostei + 0
14/05/2008
Emersonalexandre
Outra forma é fazer via código usando um FOR.
Gostei + 0
16/05/2008
Emerson Nascimento
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
16/05/2008
Essistemas
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
16/05/2008
Emerson Nascimento
Gostei + 0
16/05/2008
Essistemas
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
16/05/2008
Essistemas
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
17/05/2008
Emerson Nascimento
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
19/05/2008
Essistemas
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
Clique aqui para fazer login e interagir na Comunidade :)