Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

mistério

Mostar colunas datas enexistentes

Recommended Posts

Tenho uma tabela com datas e valores.

 

Como faço para trazer na tela uma tabela com estas datas e valores e quando não houver a data, mostar o valor como 0 (zerado).

 

Exemplo: A tabela tem os dias 6,7, e 10. e seus respectivos valores.

 

Mas devo mostrar uma tabela com as datas 6, 7, 8, 9 e 10 sendo o 8 e o 9 sem valor algum.

Compartilhar este post


Link para o post
Compartilhar em outros sites

uma solução seria criar uma tabela auxiliar com todos os dias e fazer um right join.

 

segue um simples exemplo:

set nocount on

create table #tb1  (dia int, valor real)
insert #tb1 (dia, valor) values (6, 10.6)
insert #tb1 (dia, valor) values (7, 39.5)
insert #tb1 (dia, valor) values (10, 56.1)

create table #tbAux  (dia int)
insert #tbAux (dia) values (6)
insert #tbAux (dia) values (7)
insert #tbAux (dia) values (8)
insert #tbAux (dia) values (9)
insert #tbAux (dia) values (10)

select #tbAux.dia, isnull(valor,0) as valor from #tb1
right join #tbAux on #tbAux.dia = #tb1.dia


drop table #tb1
drop table #tbAux

retorna:

dia		 valor					
----------- ------------------------ 
6		   10.6
7		   39.5
8		   0.0
9		   0.0
10		  56.099998

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu já tenho a seguinte tabela TContaReceber com as colunas DtReceber e ValorReceber

 

Como ficaria neste seu exemplo ???

 

uma solução seria criar uma tabela auxiliar com todos os dias e fazer um right join.

 

segue um simples exemplo:

set nocount on

create table #tb1  (dia int, valor real)
insert #tb1 (dia, valor) values (6, 10.6)
insert #tb1 (dia, valor) values (7, 39.5)
insert #tb1 (dia, valor) values (10, 56.1)

create table #tbAux  (dia int)
insert #tbAux (dia) values (6)
insert #tbAux (dia) values (7)
insert #tbAux (dia) values (8)
insert #tbAux (dia) values (9)
insert #tbAux (dia) values (10)

select #tbAux.dia, isnull(valor,0) as valor from #tb1
right join #tbAux on #tbAux.dia = #tb1.dia


drop table #tb1
drop table #tbAux

retorna:

dia		 valor					
----------- ------------------------ 
6		   10.6
7		   39.5
8		   0.0
9		   0.0
10		  56.099998

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu já tenho a seguinte tabela TContaReceber com as colunas DtReceber e ValorReceber

 

Como ficaria neste seu exemplo ???

 

uma solução seria criar uma tabela auxiliar com todos os dias e fazer um right join.

 

segue um simples exemplo:

set nocount on

create table #tb1  (dia int, valor real)
insert #tb1 (dia, valor) values (6, 10.6)
insert #tb1 (dia, valor) values (7, 39.5)
insert #tb1 (dia, valor) values (10, 56.1)

create table #tbAux  (dia int)
insert #tbAux (dia) values (6)
insert #tbAux (dia) values (7)
insert #tbAux (dia) values (8)
insert #tbAux (dia) values (9)
insert #tbAux (dia) values (10)

select #tbAux.dia, isnull(valor,0) as valor from #tb1
right join #tbAux on #tbAux.dia = #tb1.dia


drop table #tb1
drop table #tbAux

retorna:

dia		 valor					
----------- ------------------------ 
6		   10.6
7		   39.5
8		   0.0
9		   0.0
10		  56.099998

Eu já tenho a seguinte tabela TContaReceber com as colunas DtReceber e ValorReceber

 

Como ficaria neste seu exemplo ???

Compartilhar este post


Link para o post
Compartilhar em outros sites

cria a tabela auxiliar com os nomes que você quiser

create table #tbAux  (dia int)
insert #tbAux (dia) values (6)
insert #tbAux (dia) values (7)
insert #tbAux (dia) values (8)
insert #tbAux (dia) values (9)
insert #tbAux (dia) values (10)

e o select ficar assim

select t.dia, isnull(valor,0) as valor from TContaReceber t
right join #tbAux on #tbAux.dia = t.dia

mas faz como no exemplo dele, pega só o dia do DTreceber

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz o seguinte código:

set nocount on

create table #tbAux (dia int)
insert #tbAux (dia) values (7)
insert #tbAux (dia) values (8)

select day (TR.Data_ContaReceber) AS DIA, isnull(TR.Valor_ContaReceber,0) as 'VALOR À RECEBER' from TContaReceber TR
right join #tbAux on #tbAux.dia = day (TR.Data_ContaReceber)
order by dia

drop table #tbAux

Tenho 2 probelmas... preciso que o selec traga apenas valores que estão entre duas datas pré selecionadas.

Segundo, se tem 2 contas para receber no dia 7 ele trás duas linhas de dia 7 e o certo é trazer a somas dos valores do dia 7.

Compartilhar este post


Link para o post
Compartilhar em outros sites

select day (TR.Data_ContaReceber) AS DIA, sum(isnull(TR.Valor_ContaReceber,0)) as 'VALOR À RECEBER' 
from TContaReceber TR
left join #tbAux on #tbAux.dia = day (TR.Data_ContaReceber)
group by day (TR.Data_ContaReceber)
order by dia

vê se resolve,

 

coloquei o SUM no valor e com isso tive que fazer um group by

e troquei de right join para LEFT JOIN

 

testa aí

Compartilhar este post


Link para o post
Compartilhar em outros sites

O SUM no valor e a troca de right pelo left rodou bem, porém temos alguns problemas.

 

- Tem alguns dias vindos como nulos.

- Preciso que o Select só me traga apenas valores que um determinado período, onde coloco o between para selecionar este periodo na tabela TContasReceber.

 

O código está assim:

set nocount on
set dateformat dmy
create table #tbAux (dia int)
insert #tbAux (dia) values (1) insert #tbAux (dia) values (2) insert #tbAux (dia) values (3) insert #tbAux (dia) values (4) insert #tbAux (dia) values (5)
insert #tbAux (dia) values (6) insert #tbAux (dia) values (7) insert #tbAux (dia) values (8) insert #tbAux (dia) values (9) insert #tbAux (dia) values (10)
insert #tbAux (dia) values (11) insert #tbAux (dia) values (12) insert #tbAux (dia) values (13) insert #tbAux (dia) values (14) insert #tbAux (dia) values (15)
insert #tbAux (dia) values (16) insert #tbAux (dia) values (17) insert #tbAux (dia) values (18) insert #tbAux (dia) values (19) insert #tbAux (dia) values (20)
insert #tbAux (dia) values (21) insert #tbAux (dia) values (22) insert #tbAux (dia) values (23) insert #tbAux (dia) values (24) insert #tbAux (dia) values (25)
insert #tbAux (dia) values (26) insert #tbAux (dia) values (27) insert #tbAux (dia) values (28) insert #tbAux (dia) values (29) insert #tbAux (dia) values (30)
insert #tbAux (dia) values (31)

select #tbAux.DIA, month (TR.Data_ContaReceber) as MES, year (TR.Data_ContaReceber) as ANO, sum(isnull(TR.Valor_ContaReceber,0)) as 'SUB TOTAL' from TContaReceber TR
left join #tbAux on #tbAux.dia = day (TR.Data_ContaReceber) AND TR.Data_ContaReceber between '01/07/2007' and '31/07/2007'
group by #tbAux.dia, month (TR.Data_ContaReceber), year (TR.Data_ContaReceber)
order by #tbAux.dia, mes

drop table #tbAux

Compartilhar este post


Link para o post
Compartilhar em outros sites

select day (TR.Data_ContaReceber) AS DIA, sum(isnull(TR.Valor_ContaReceber,0)) as 'VALOR À RECEBER'
from TContaReceber TR
right join #tbAux on #tbAux.dia = day (TR.Data_ContaReceber)
where TR.Data_ContaReceber between '01/07/2007' and '31/07/2007'
group by day (TR.Data_ContaReceber)
order by dia

na tabela auxiliar você cadastrou todos os dia, então troca o left pelo right como nesse select e vê o que acontece

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.