Meu select está vindo vazio e tem dados

22/04/2013

1

Esse é meu select. Existe dados em Liminar e Sentenca, mas em Acordão e Acordo não existe. Na query abaixo não deveria vir dados e nesses que não há informações vir null?

WITH
CTE_A AS
(SELECT CONVERT(DATETIME, FLOOR(CONVERT(FLOAT(24),DT_LANCAMENTO)))AS DT_LANCAMENTO,
COUNT(*) AS CUMPRIMENTO FROM TBL_CUMPRIMENTO
WHERE CONVERT(DATETIME,FLOOR(CONVERT(FLOAT(24),DT_LANCAMENTO)))BETWEEN '15/04/2013' AND '22/04/2013'
AND EXECUTADO = 'SIM'
GROUP BY CONVERT(DATETIME, FLOOR(CONVERT(FLOAT(24),DT_LANCAMENTO)))),
CTE_B AS
(SELECT CONVERT(DATETIME, FLOOR(CONVERT(FLOAT(24),DT_LANCAMENTO)))AS DT_LANCAMENTO,
COUNT(*) AS LIMINAR FROM TBL_CADASTRO
WHERE CONVERT(DATETIME, FLOOR(CONVERT(FLOAT(24),DT_LANCAMENTO))) BETWEEN '15/04/2013' AND '22/04/2013'
AND ID_CADASTRO IN (SELECT ID_CADASTRO FROM TBL_TAREFA WHERE NM_TAREFA = 'LIMINAR' )
GROUP BY CONVERT(DATETIME, FLOOR(CONVERT(FLOAT(24),DT_LANCAMENTO)))),
CTE_C AS
(SELECT CONVERT(DATETIME, FLOOR(CONVERT(FLOAT(24),DT_LANCAMENTO)))AS DT_LANCAMENTO,
COUNT(*) AS SENTENCA FROM TBL_CADASTRO
WHERE CONVERT(DATETIME, FLOOR(CONVERT(FLOAT(24),DT_LANCAMENTO))) BETWEEN '15/04/2013' AND '22/04/2013'
AND ID_CADASTRO IN (SELECT ID_CADASTRO FROM TBL_TAREFA WHERE NM_TAREFA = 'SENTENÇA' )
GROUP BY CONVERT(DATETIME, FLOOR(CONVERT(FLOAT(24),DT_LANCAMENTO)))),
CTE_D AS
(SELECT CONVERT(DATETIME, FLOOR(CONVERT(FLOAT(24),DT_LANCAMENTO)))AS DT_LANCAMENTO,
COUNT(*) AS ACORDO FROM TBL_CADASTRO
WHERE CONVERT(DATETIME, FLOOR(CONVERT(FLOAT(24),DT_LANCAMENTO))) BETWEEN '15/04/2013' AND '22/04/2013'
AND ID_CADASTRO IN (SELECT ID_CADASTRO FROM TBL_TAREFA WHERE NM_TAREFA = 'ACORDO' )
GROUP BY CONVERT(DATETIME, FLOOR(CONVERT(FLOAT(24),DT_LANCAMENTO)))),
CTE_E AS
(SELECT CONVERT(DATETIME, FLOOR(CONVERT(FLOAT(24),DT_LANCAMENTO)))AS DT_LANCAMENTO,
COUNT(*) AS ACORDAO FROM TBL_CADASTRO
WHERE CONVERT(DATETIME, FLOOR(CONVERT(FLOAT(24),DT_LANCAMENTO))) BETWEEN '15/04/2013' AND '22/04/2013'
AND ID_CADASTRO IN (SELECT ID_CADASTRO FROM TBL_TAREFA WHERE NM_TAREFA = 'ACÓRDÃO' )
GROUP BY CONVERT(DATETIME, FLOOR(CONVERT(FLOAT(24),DT_LANCAMENTO))))

SELECT CONVERT(VARCHAR, A.DT_LANCAMENTO, 103) AS DATA,(LIMINAR-CUMPRIMENTO)AS TT_LIMINAR,
(SENTENCA-CUMPRIMENTO)AS TT_SENTENCA,(ACORDO-CUMPRIMENTO)AS TT_ACORDO,(ACORDAO-CUMPRIMENTO)AS TT_ACORDAO
FROM CTE_A A
INNER JOIN CTE_B B ON CONVERT(VARCHAR(10), A.DT_LANCAMENTO,103) = CONVERT(VARCHAR(10), B.DT_LANCAMENTO,103)
INNER JOIN CTE_C C ON CONVERT(VARCHAR(10), A.DT_LANCAMENTO,103) = CONVERT(VARCHAR(10), C.DT_LANCAMENTO,103)
INNER JOIN CTE_D D ON CONVERT(VARCHAR(10), A.DT_LANCAMENTO,103) = CONVERT(VARCHAR(10), D.DT_LANCAMENTO,103)
INNER JOIN CTE_E E ON CONVERT(VARCHAR(10), A.DT_LANCAMENTO,103) = CONVERT(VARCHAR(10), E.DT_LANCAMENTO,103)

Responder

Posts

22/04/2013

Alex Lekao

Ola boa tarde!!!

Experimente substituir o INNER JOIN por LEFT JOIN por exemplo e ve se funciona.

Abraco.

Alex - Lekao
Responder

22/04/2013

Pjava

Fiz com left e veio apenas um resultado, referente a liminar, mas sentenca também tem resultado
Responder

22/04/2013

Pjava

Interessante, que se eu rodar o select referente a liminar, vem 5 linhas, referente aos dias(15,16,17,18 e 19) e nesse total vem apenas um, mas aí acho que é por causa da data.

Esse select me traz 5 linhas

SELECT CONVERT(DATETIME, FLOOR(CONVERT(FLOAT(24),DT_LANCAMENTO)))AS DT_LANCAMENTO,
COUNT(*) AS LIMINAR FROM TBL_CADASTRO
WHERE CONVERT(DATETIME, FLOOR(CONVERT(FLOAT(24),DT_LANCAMENTO))) BETWEEN '15/04/2013' AND '22/04/2013'
AND ID_CADASTRO IN (SELECT ID_CADASTRO FROM TBL_TAREFA WHERE NM_TAREFA = 'LIMINAR' )
GROUP BY CONVERT(DATETIME, FLOOR(CONVERT(FLOAT(24),DT_LANCAMENTO)))
Responder

22/04/2013

Pjava

Acho que já sei o porque. É que na tabela de Cumprimento(a primeira) eu tenho registro somente no dia 19, logo eu só vou ter um resultado final nesse dia e como o Left é em cima dessa query, só vou trazer resultado que houver nesse dia, certo? Sendo isso, assunto resolvido.
Responder

22/04/2013

Joel Rodrigues

Obrigado pelo retorno, PJava.
Estou marcando este tópico como Concluído.
Responder

22/04/2013

Alex Lekao

Sim, acredito que sera isto mesmo.

Basicamente qdo vc usa INNER ira apresentar a Intercessão entre as duas tabelas, no caso terá que apresentar um registro que conste nas duas tabelas.

Caso vc queira usar como base uma tabela e mostrar o resultado desta tabela independente de ter ou não o resultado vc deve usar o LEFT ou o RIGHT.

Mas acredito que esteja correto esse pensamento que disse.

Honestamente eu me perco um pouco com os seus selects, como não conheço a estrutura do seu banco para mim fica meio complicado, não entendo muito bem o pq de Usar tanto as CTEs. rsrsr

Mas eh isso ae, se conferiu e deu certo, ta lindo, manda pau... rsrsr

Abraco.

Alex - Lekao
Responder

22/04/2013

Pjava

Eu não sou lá essas coisas com BD e SQL. Esse select eu peguei de uma cara e está dando certo, são vários counts que eu preciso fazer e várias situações. Como deu certo e não tenho tempo pra nada mais, ficou assim e sempre que preciso de outro select nesse aspecto eu utilizo esses CTE e que nem sei porque,rs. Se funfa, vai assim mesmo.
Responder

22/04/2013

Alex Lekao

blz...

eu tbm tenho meus esqueletos... rsrsr

vou so fazendo alterações isso eh normal.

se não me engano a CTE eh uma tabela temporária, mais usada para fazer algum tipo de cruzamento, não sou la estas coisas com BD tbm não... rsrsr

Eu não costumo usar as CTEs, acredito que são mais lentas, já li e vi alguma coisa a respeito no curso que fiz, mas honestamente ate hoje não consegui usar.

Qdo preciso fazer algo um pouco diferente eu uso um jeito diferente de fazer tabela temporária que acredito que fique um pouco mais rápida que uma CTE.

Mas cara ta funcionando... ta lindo... so recomendo tentar verificar com relação a desempenho e se não esta faltando nenhum índice, com isso já da uma melhorada no desempenho e tal.

tem umas coisas de boas praticas que eh bom dar uma observada, mas caso contrario... toca o pau... rsrsr

Abraco.

Alex - Lekao
Responder