select com campos especificados

Firebird

20/08/2013

boa tarde,

to querendo fazer uma consulta da seguinte maneira:

SELECT (CAMPO WHERE CAMPO = 1) AS 1, (CAMPO WHERE CAMPO = 2) AS 2 FROM TABELA

como é possivel?

abraços.
Italo Pereira

Italo Pereira

Curtidas 0

Respostas

Alex Lekao

Alex Lekao

20/08/2013

Oi Italo, boa tarde!!!

Tenta assim:

select
campo1,
campo2
from tabela
where campo1 = 1 or campo2 = 2

ou entao.

select
campo1,
campo2
from tabela
where campo1 = 1
and campo2 = 2

verifica se eh isso que vc queria e posta ai.

dependendo do que for a gente ve mais alguma coisa.

Espero ter ajudado.

Abraco.

Alex - Lekao
GOSTEI 0
Italo Pereira

Italo Pereira

20/08/2013

oi amigo,

nao sao 2 campos diferentes, sao o mesmo campo, mas com informacoes diferentes, ex:

campo1 where campo1 = salario
campo1 where campo1 = extras

o mesmo campo1, mas de duas formas diferentes.

espero que tenham entendido.

abraço.
GOSTEI 0
Deivison Melo

Deivison Melo

20/08/2013

Se entendi o que você está querendo, vamos lá...

se utilizar a instrução sql dessa forma:

SELECT (CAMPO WHERE CAMPO = 1) AS 1, (CAMPO WHERE CAMPO = 2) AS 2 FROM TABELA

deverá garantir que em cada um das query´s que foram utilizadas como campo não retornem mais
de uma informação, pois o sql não consegue tratar e vai dar erro de "multiple rows".

Qualquer dúvida postar para poder ajudá-lo da melhor forma possível...

Abração caro conterrâneo (O cara é do meu estado, vou puxar a sardinha... rsrs (Brincadeira pessoal))

Abração a todos e bons códigos!!!!

GOSTEI 0
Alex Lekao

Alex Lekao

20/08/2013

Sem problemas Deividson... rsrsr

Entao Italo, o que vc quer eh aparesentar apenas os registros quem tenham as informacoes salario e extra por exemplo? ou se tiver uma das duas ja devera aparecer?

Mais uma coisa, existe algum registro diferenciador? por exemplo codigo de funcionaciorio(codfunc... sei la... rsrsr)???

Caso seja isso, talvez vc teria duas linhas com o mesmo codigo e uma mostraria salario e a aoutra extra, neste caso vc teria que usar o seguinte select, select codfunc as funcionario,campo from tabela where campo = 'salario' or campo='extra', se vc estiver querendo que mostre somente o registro que tenha as duas informacoes teria que usar select codfunc, campo from tabela where campo='salario' and campo = 'extra'.

nao sei se entendi correto e se me expressei corretamente e se deu para vc entender... rsrsr

abraco.
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

20/08/2013

deve ser algo assim:

select
  (case when tipo = 'S' then valor else 0 end) salario,
  (case when tipo = 'E' then valor else 0 end) extra,
  *
from
  tabela
GOSTEI 0
Teí Sistemas

Teí Sistemas

20/08/2013

Bom dia,

Dê uma olhada no comando List do Firebird, acho que ele pode ajudar neste caso.

Abraço.
GOSTEI 0
Italo Pereira

Italo Pereira

20/08/2013

valew deivison e alex, mas nao deu.

vou tentar a forma que emerson postou.

GOSTEI 0
Italo Pereira

Italo Pereira

20/08/2013

To quase conseguindo, usei assim:

select
funcionario.nome, 
(case when vencimentos.nome = 'HORAS TRABALHADAS' then valor else 0 end) horas,
sum(case when vencimentos.nome <> 'HORAS TRABALHADAS' then valor else 0 end) outros
from funcionario, vencimentos
where ano = 2013 and mes = 3
group by funcionario.nome, horas


o resultado foi o seguinte:
[url]http://pendrivesbrasil.com.br/resultado.jpg[/url]

o que falta:

- vejam que eu filtrei por mes e por ano, mas no resultado, ele listou varios meses na primeira coluna e somou todos os meses na segunda.
- ele nao listou em uma unica linha

mas com essa dica já deu uma bela ajuda. caso tenham mais alguma dica, eu sou muito grato.

abraços.
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

20/08/2013

não sei se entendi a sua necessidade, mas vamos lá:

pode ser assim, indicando o mês:

select
f.nome,
sum(case when v.nome = 'HORAS TRABALHADAS' then v.valor else 0 end) horas,
sum(case when v.nome <> 'HORAS TRABALHADAS' then v.valor else 0 end) outros
from funcionario f
left join vencimentos v on v.codigofuncionario = f.codigofuncionario
where v.ano = 2013 and v.mes = 3
group by f.nome



ou pode ser assim, indicando apenas o ano e deixando a instrução listar o mês:
select
f.nome, v.mes,
sum(case when v.nome = 'HORAS TRABALHADAS' then v.valor else 0 end) horas,
sum(case when v.nome <> 'HORAS TRABALHADAS' then v.valor else 0 end) outros
from funcionario f
left join vencimentos v on v.codigofuncionario = f.codigofuncionario
where v.ano = 2013
group by f.nome, v.mes

GOSTEI 0
Alex Lekao

Alex Lekao

20/08/2013

Ola Italo, boa tarde!!!

Acredito que a segunda sugestao do Emerson resolva seu problema.

Uma sugestao que dou em cima dela, eh nao usar o Left Join porque o Firebird nao tem bom desempenho com os Joins; utiliza da forma que estava usando no seu codigo, listando as tabelas sequencialmente.

Outra sugestao para nivel de conhecimento, faca os testes das duas maneiras, usando o join e relacionando a tabela sequealmente e veja como ficam os desempenhos.

Acredito que esse teste sera interessante para aprendizado e conhecimento nas melhores praticas com relacao ao firebird.

Nos meus testes aqui, que os bancos que utilizo tem bastante registros a diferenca eh bem grande.

Espero que de tudo certo.

Abraco.

Alex - Lekao
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

20/08/2013

olá Alex.

explica direito isso aí do left join.... a performance é fantástica (desde que haja índice compreendendo os campos utilizados no relacionamento).

eu nunca tinha ouvido falar que a performance fica comprometida quando se usa left join....

select
f.nome, v.mes,
sum(case when v.nome = 'HORAS TRABALHADAS' then v.valor else 0 end) horas,
sum(case when v.nome <> 'HORAS TRABALHADAS' then v.valor else 0 end) outros
from funcionario f
left join vencimentos v on v.codigofuncionario = f.codigofuncionario
where v.ano = 2013
group by f.nome, v.mes


no exemplo acima, a tabela vencimentos precisa ter um índice por 'codigodofuncionario' e também por 'ano', visto que estes campos estão sendo usados relacionamento e na condição de filtragem.

quando se usa os índices corretos a performance é ótima.

para identificar quais índices poderão melhorar a performance de uma instrução basta ler a plano de execução da mesma.

GOSTEI 0
Alex Lekao

Alex Lekao

20/08/2013

Ola Emerson, boa Noite!!!

O que disse eh que o firebird nao tem um bom desempenho com joins ao contrario do SQL Server que o desempenho eh melhor com Joins no lugar de usar os relacionamentos em serie.

Nas esperiencias que fiz com selects exatamente iguais em ambos os SGBDs e os campos devidamente indexados a performance do Firebird foi inferior que a performance do SQL Serer usando Joins, e quando foi executado selecoes identicas com relacionamento em seria o desempenho do Firebird foi Superior em relacao ao SQL Server.

Abraco.

Alex - Lekao
GOSTEI 0
Italo Pereira

Italo Pereira

20/08/2013

oi amigos,

realmente a segunda opcao funcionou pra mim, sim.

quanto a questao de desempenho, nao deu muito problema porque eu tenho poucos registros no banco, entao funcionou muito bem aqui da forma que emerson postou.

grato a todos pela ajuda e podem fechar o topico.

;)
GOSTEI 0
José

José

20/08/2013

Italo obrigado por sinalizar que sua duvida foi sanada.
Tópico concluído.
GOSTEI 0
POSTAR