Select não funciona!

14 respostas
R

ola pessoal, to eu aqui num sabado a noite apanhando de um select. Ele me gera o seguinte erro:

Msg 4145, Level 15, State 1, Line 14
An expression of non-boolean type specified in a context where a condition is expected, near ‘on’.

procurei no google algumas definições mas naum entendi muito bein por que ocorre esse erro, pra mim parece correto esse select, mas o sql server me diz que naum.hehehehe :x

select dim_tempo_compras.id_data_compra,  dim_produto_compras.id_produto, dim_fornecedor.id_fornecedor,
COUNT (*) AS QTD_compras ,
sum (valor_total) as valor_compra
from compras
inner join dim_tempo_compras on year(compras.data_compra) = dim_tempo_compras.ano and 
                                month (compras.data_compra) = dim_tempo_compras.mes 
-- dimensao tempo ligando a compras

inner join prod_compras on compras.cod_compra = prod_compras.cod_compra
inner join dim_produto_compras on prod_compras.cod_prod = dim_produto_compras.id_produto 
--dimensão produto liganddo a prod_compras

inner join produtos on prod_compras.cod_prod = produtos.cod_prod and
dim_produto_compras on produtos.cod_prod = dim_produto_compras.id_produto
-- dim_produto ligando a produtos

inner join compras on fornecedor.cod_forn = compras.cod_forn 
inner join dim_fornecedor on compras.cod_forn = dim_fornecedor.id_fornecedor
-- dim_fornecedor ligando a compra

GROUP BY  dim_tempo_compras.id_data_compra, 
          dim_produto_compras.id_produto,
          dim_fornecedor.id_fornecedor

14 Respostas

J

Acredito que o erro deve esta nessa área:

inner join produtos on prod_compras.cod_prod = produtos.cod_prod and
dim_produto_compras on produtos.cod_prod = dim_produto_compras.id_produto
– dim_produto ligando a produtos

Boa sorte com seu SELECT. :slight_smile:

[]`s

R

Bem ja éh segunda feira e eu continuo apanhado para esse maldito select. Ja mudei a sintaxe tentei colocar and, tentei colocar uma virgula, axo e continua esse erro. alguem poderia me explicar o que significa esse erro, talvez dessa forma eu consiga chegar a definição do erro.

K

dim_produto_compras on produtos.cod_prod = dim_produto_compras.id_produto

tenta alterar o ‘on’ por and ou where pra ver oque acontece.

ou entao

coloca um inner join dim_produto_compras on produtos.cod_prod = dim_produto_compras.id_produto
pode ser que de certo

R

se eu colocar where ou and gera esse erro: Msg 4145, Level 15, State 1, Line 15
An expression of non-boolean type specified in a context where a condition is expected, near ‘on’.

inner join produtos on prod_compras.cod_prod = produtos.cod_prod [b]and[/b]
dim_produto_compras on produtos.cod_prod = dim_produto_compras.id_produto
-- dim_produto ligando a produtos

se eu tentar o inner join, me gera um erro pior ainda: Msg 208, Level 16, State 1, Line 1
Invalid object name ‘compras’.

inner join produtos on prod_compras.cod_prod = produtos.cod_prod 
[b]inner join [/b]dim_produto_compras on produtos.cod_prod = dim_produto_compras.id_produto
-- dim_produto ligando a produtos

E agora? me ferrei bonito com esse select.

R

Oi,

Teste isso:
select 
  dim_tempo_compras.id_data_compra,  
  dim_produto_compras.id_produto, 
  dim_fornecedor.id_fornecedor,
  COUNT (*) AS QTD_compras ,
  sum (valor_total) as valor_compra

from compras, dim_tempo_compras, produtos, dim_fornecedor, dim_tempo_compras

where year(compras.data_compra) = dim_tempo_compras.ano 
  and month(compras.data_compra) = dim_tempo_compras.mes
  and compras.cod_forn = dim_fornecedor.id_fornecedor
  and compras.cod_compra = prod_compras.cod_compra
  and prod_compras.cod_prod = dim_produto_compras.id_produto
  and prod_compras.cod_prod = produtos.cod_prod
  and produtos.cod_prod = dim_produto_compras.id_produto
  and fornecedor.cod_forn = compras.cod_forn
  
group by
  dim_tempo_compras.id_data_compra, 
  dim_produto_compras.id_produto,
  dim_fornecedor.id_fornecedor

Depois reveja a necessidade de algumas tabelas, como por exemplo: dim_fornecedor, não vi necessidade dela no select.

R

ola amigo, seu select pode estar certo, no entanto não atinge o propósito do professor. Isso por que , esse select vai se tornar um insert nas tabelas dim_fornecedor,dim_tempo_compras e dim_produtos. E eu preciso fazer desta forma para fazer parte da metodologia da aula, eu já havia proposto uma forma semelhante, mas ele quer desta forma. Assim sendo,esse select compara os dados das tabelas ‘originais’ com as tabelas que eu extrai os dados, ou seja as ‘dimensões’, estou montando um esquema estrela , preciso axar uma forma semelhante de montar esse select, senão eu to ferrado.

R

Oi,

Não entendi nada do que falou. Só mudei a cláusula FROM e adicionei a WHERE em seu comando (você só usou inner join que pode ser substuido facilmente pela forma que eu fiz). O que isso tem a haver com INSERT? Seu professor obrigou a usar INNER JOIN, se for isso tudo bem, meu comando não atende, mas se não ele não teria diferença de resultado para o seu.

R

Rafael, como já disseram, o erro está neste trecho onde falta um “[INNER|LEFT|RIGHT] JOIN”:

inner join produtos on prod_compras.cod_prod = produtos.cod_prod inner join dim_produto_compras on produtos.cod_prod = dim_produto_compras.id_produto -- dim_produto ligando a produtos
Este outro erro que deu após você acrescentar o identificador, é uma outra história.
A tabela “compras” existe? O nome dela é este mesmo?

Abraços,

Marcos A. C. Jordão’’

R

É sim, compras. Eu não sei se me expliquei direito, mas as tabelas que começam com ‘dim’ , (dim_tempo_compras,dim_fornecedor, dim_produtos_compras) não tem relacionamento com as outras tabelas, pex. compras. Essas tabelas dim(dim, atribui-se a dimensão ) só tem relacionamento com as tabela ‘Fato’, que onde eu desejo inserir os dados deste select. To fazendo um esquema estrela., por isso que estou fazendo o select desta forma, sera que ficou um pouquinho mais claro? Então quando coloco o inner join neste lugar da esse erro, pq não relacionamento,pelo menos é o que eu axo, (possivelmente eu possa estar errado quanto a isso).

R

rafaelglauber , é isso mesmo, preciso usar o inner join. E quanto ao insert que eu mencionei é o seguinte, vou dar um insert na tabela 'fato’que é aquela tabela que contém as chaves secundarias das tabelas dimensões (dim_fornecedor.,dim_produto_compras, dim_tempo_compras). Eu apenas não postei o insert aqui no forum, porque se o select 'funkar’dai é só alegria, porque para inserir é só mais uma linha na query.

K

cara tem certeza que a tabela ta certa?
agora do jeito que ta, é mais possivel ter algo errado na tabela do que no seu source.

R

Oi,

select 
  dim_tempo_compras.id_data_compra,  
  dim_produto_compras.id_produto, 
  dim_fornecedor.id_fornecedor,
  COUNT (*) AS QTD_compras ,
  sum (valor_total) as valor_compra
from compras

inner join dim_tempo_compras on (year(compras.data_compra) = dim_tempo_compras.ano 
                                 and month(compras.data_compra) = dim_tempo_compras.mes)

inner join prod_compras on (compras.cod_compra = prod_compras.cod_compra)

inner join dim_produto_compras on (prod_compras.cod_prod = dim_produto_compras.id_produto)

inner join dim_fornecedor on (compras.cod_forn = dim_fornecedor.id_fornecedor)

inner join produtos on (prod_compras.cod_prod = produtos.cod_prod)

inner join fornecedor on (fornecedor.cod_forn = compras.cod_forn)

GROUP BY  dim_tempo_compras.id_data_compra, 
          dim_produto_compras.id_produto,
          dim_fornecedor.id_fornecedor

Quando você tem por exemplo três tabelas:

cliente
-id_cliente
-nome

cliente_filial
-id_cliente
-id_filial

pedido
-id_pedido
-id_filial
-id_cliente

você não precisa testar id_cliente várias vezes, bastaria:

select p.* from pedido p, cliente c, cliente_filial f where
p.id_cliente = f.id_cliente
p.id_filial = f.id_filial
f.id_cliente=c.id_cliente
p.id_cliente=c.id_cliente --// ISSO NÃO PRECISA, POIS EU JÁ TESTEI NA LINHA ACIMA

O local onde todo mundo já apontou o erro é justamente onde você testou mais de uma vez a mesma condição e erro na sintaxe.

R

olá , eu entendi o que vc esta descrevendo, no entanto, a tabela compras existe sim , SÓ QUE ELA NAUM FAZ RELACIOMENTO COM AS TABELAS DIMENSÕES, e no seu exemplo as tabelas tem relacinonamento entre elas . O que eu precisa que vcs entendam é isso, apenas. No lugar do inner join tentei colocar um and ou uma virgula dai da aqueles erros que mencionei la encima. E esse seu select da o seguinte erro: Msg 208, Level 16, State 1, Line 1
Invalid object name ‘compras’.

Esse erro naum tah dando por causa do relacionamente entre as tabelas?

A tabela compras tah desta forma: A tabela 'FATO’onde quero inserir os valores está assim:

COD_COMPRA, (Pk) id_fornecedor (fk) ------ tabela dimensão dim_fornecedor
COD_FORN, (Fk) id_data_compra (fk)— tabela dimensão dim_data_compra
DATA_COMPRA, id_produto (fk)--------- tabela dimensão dim_ produto_compra
VALOR_TOTAL qtd_compras (fk)
valor_compra

As tabelas 'dim, só tem relacionamento com as tabela fato. Ai que esta o grande problema como ligar tudo isso?

R

Vcs estavam certos… agora consegui entender o que eu estava tentando fazer… mto obrigado pela atenção de vcs… consegui rodar esse select… agora tenho outros problemas, mas como disse nosso amigo ai de cima isto é outra história… :-o hehehehe

Criado 11 de outubro de 2008
Ultima resposta 13 de out. de 2008
Respostas 14
Participantes 5