Ir para conteúdo
Fórum Script Brasil
  • 0

Query complicada...


Shakazahn

Pergunta

Olá,

Eu estou montando um banco de dados para cadastro de quadrinhos, onde você pode cadastrar os quadrinhos que quiser e sua periodicidade, e estou tentando montar uma query que monte uma "planilha mensal" dos quadrinhos que serão lançados durante o mês atual.

Por enquanto tenho uma tabelaQuadrinhos (QuadrinhoID, PeriodicidadeID, Nome, Data), tabelaPeriodicidade (PeriodicidadeID, Nome, DiasDoPeriodo), tabelaLancamentos (LancamentoID, QuadrinhoID, NumeroQuadrinho, DataLancado, DataComprado).

A query tem que mostrar todos os quadrinhos que serão lançados no mês atual (ou outro escolhido). O que eu fiz é:

DECLARE @MesAtual = 2 --Fevereiro
SELECT 
q.Quadrinho,
qp.Periodicidade,
qp.DiasDoPeriodo,
DATEADD("d", qp.DiasDoPeriodo, MAX(l.DataLancado)) AS ProximoLancamentoData, --Esta coluna é só pra saber a prox. data
CASE 
  WHEN MONTH(DATEADD("d", qp.DiasDoPeriodo, MAX(l.DataLancado))) = @MesAtual
  THEN DATEADD("d", qp.DiasDoPeriodo, MAX(l.DataLancado)) 
END
AS LancamentoMensal --Esta coluna só vai aparecer se o prox. lancamento for no mês Atual
FROM tabelaQuadrinhos q
INNER JOIN tabelaPeriodicidade qp ON q.PeriodicidadeID = qp.PeriodicidadeID
LEFT JOIN tabelaLancamentos l ON q.QuadrinhoID = l.QuadrinhoID
GROUP BY q.Quadrinho, qp.Periodicidade, qp.DiasDoPeriodo
Até aqui está funcionando bem, mas eu estou com um problema que é no caso de registros com uma periodicidade menor do que 1 mês (quadrinhos semanais e quinzenais por exemplo). Eu estou tentando descobrir um jeito que eu posso incluir um outro registro caso a última data + periodo ainda seja no mês atual. Tentei usar uma tabela temporária pra guardar os registros (#planilhaMensal) e:
INSERT INTO #planilhaMensal (Quadrinho, Periodicidade, DiasDoPeriodo, ProximoLancamentoData, LancamentoMensal)
SELECT 
Quadrinho,
Periodicidade,
DiasDoPeriodo,
DATEADD("d", Dias, MAX(ProximoLancamentoData)) AS ProximoLancamentoData,
CASE 
  WHEN MONTH(DATEADD("d", Dias, MAX(ProximoLancamentoData))) = @MesAtual
  THEN DATEADD("d", Dias, MAX(ProximoLancamentoData))
END
AS LancamentoMensal
FROM #planilhaMensal
GROUP BY Quadrinho, Periodicidade, DiasDoPeriodo, ProximoLancamentoData

Isto aqui também funcionou, porém só 1 vez.

Eu consigo os registros que terão um lancamento ainda este mês e incluo na própria tabela, mas se eu rodar isto uma segunda vez, eu terei os mesmos registros duplicados.

Eu acho que o certo seria usar um WHILE, mas não consigo um SELECT que devolva somente 1 registro (se vier vários o WHILE não aceita) para resolver.

Alguém tem uma sugestão de como posso resolver isso?

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

Boa tarde Shakazahn,

Não sei se este script vai funcionar, pois não consegui testar... mas tentei fazer da seguinte forma: inclui mais um WHEN no CASE, testando se a soma dos dias da "DataLancado" e "DiasDoPeriodo" é superior ao número do ultimo dia do mês. Se for menor, quer dizer que o lançamento ainda estará no mês corrente.

Não sei se é isto que deseja, mas faça os testes aí... :.)

DECLARE @MesAtual INT
SET @MesAtual= 2 --Fevereiro
SELECT 
q.Quadrinho,
qp.Periodicidade,
qp.DiasDoPeriodo,
DATEADD("d", qp.DiasDoPeriodo, MAX(l.DataLancado)) AS ProximoLancamentoData, --Esta coluna é só pra saber a prox. data
CASE 
  WHEN MONTH(DATEADD("d", qp.DiasDoPeriodo, MAX(l.DataLancado))) = @MesAtual
  THEN DATEADD("d", qp.DiasDoPeriodo, MAX(l.DataLancado))
  WHEN CAST(DAY(MAX(l.DataLancado)) AS INT) + qp.DiasDoPeriodo <= (DAY(dateadd(m,1,dateadd(d,-day(getdate()),getdate()))))
  THEN -- Aqui você coloca o que quiser
END
AS LancamentoMensal --Esta coluna só vai aparecer se o prox. lancamento for no mês Atual
FROM tabelaQuadrinhos q
INNER JOIN tabelaPeriodicidade qp ON q.PeriodicidadeID = qp.PeriodicidadeID
LEFT JOIN tabelaLancamentos l ON q.QuadrinhoID = l.QuadrinhoID
GROUP BY q.Quadrinho, qp.Periodicidade, qp.DiasDoPeriodo

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      652k
×
×
  • Criar Novo...