How to use WHERE function in column created from a formula?

Asked

Viewed 609 times

2

I wrote that code:

SELECT produtos.id AS id, 
nome_produto AS Nome, 
SUM(estoque.Estoque_produto) AS Estoque, 
Periodicidade AS Periodicidade, 
produtos.estoquemax_produto AS 'Média de venda mensal',
IF(SUM(estoque.Estoque_produto) > produtos.estoquemax_produto * 2, 'Muito alto', IF(SUM(estoque.Estoque_produto) > produtos.estoquemax_produto , 'Alto', IF(SUM(estoque.Estoque_produto) > (produtos.estoquemax_produto / IF(Periodicidade = 'M' , 1 , IF(Periodicidade = 'Q' , 2 , 4))) *0.5, 'Bom', IF(SUM(estoque.Estoque_produto) > (produtos.estoquemax_produto / IF(Periodicidade = 'M' , 1 , IF(Periodicidade = 'Q' , 2 , 4))) * 0.3, 'Baixo', IF(SUM(estoque.Estoque_produto) >  0, 'Crítico', 'Zerado'))))) AS Estado, 
precos.Custo_produto AS Custo, 
produtos.fornecedor_principal AS Fornecedor,
Descricao_produto AS 'Marca/Laboratório', 
grupos_prod.Nome_grupo AS Grupo, 
subgrupos.Nome AS Subgrupo

FROM genius.produtos
JOIN produtos_estoque AS estoque ON produtos.id = estoque.id_produto
JOIN produtos_precos AS precos ON produtos.id = precos.id_produto
JOIN subgruposprodutos AS subgrupos ON produtos.Id_grupo = subgrupos.Id
JOIN grupos_produtos AS grupos_prod ON subgrupos.id_grupo = grupos_prod.Id
WHERE Estado = 'Alto'
GROUP BY Id;

When I run it returns me the error :

Error Code: 1054. Unknown column 'State' in 'Where clause'

The problem is that the Status column is given as a result of that part :

IF(SUM(estoque.Estoque_produto) > produtos.estoquemax_produto * 2, 'Muito alto', 
IF(SUM(estoque.Estoque_produto) > produtos.estoquemax_produto , 'Alto',
IF(SUM(estoque.Estoque_produto) > (produtos.estoquemax_produto / 
IF(Periodicidade = 'M' , 1 , IF(Periodicidade = 'Q' , 2 , 4))) *0.5, 'Bom', 
IF(SUM(estoque.Estoque_produto) > (produtos.estoquemax_produto / 
IF(Periodicidade = 'M' , 1 , IF(Periodicidade = 'Q' , 2 , 4))) * 0.3, 'Baixo', 
IF(SUM(estoque.Estoque_produto) >  0, 'Crítico', 'Zerado'))))) AS Estado,

i.e., it is the result of a formula and not a column of a BD table. and the problem only appeared when I used the:

WHERE Estado = 'Alto'

Someone knows how to fix this?

2 answers

2


Make a subselect, your column State , does not yet exist within the context you are creating, ie it is the composition of the line.

IF(SUM(estoque.Estoque_produto) > produtos.estoquemax_produto * 2, 'Muito alto',
IF(SUM(estoque.Estoque_produto) > produtos.estoquemax_produto , 'Alto', 
IF(SUM(estoque.Estoque_produto) > (produtos.estoquemax_produto / 
IF(Periodicidade = 'M' , 1 , IF(Periodicidade = 'Q' , 2 , 4))) *0.5, 'Bom', 
IF(SUM(estoque.Estoque_produto) > (produtos.estoquemax_produto / 
IF(Periodicidade = 'M' , 1 , IF(Periodicidade = 'Q' , 2 , 4))) * 0.3, 'Baixo', 
IF(SUM(estoque.Estoque_produto) >  0, 'Crítico', 'Zerado'))))) AS Estado,

this (column/value) exists only within your select, for you to access them you have to create a subselect then use in a where.

select * from 
(
    SELECT produtos.id AS id, 
    nome_produto AS Nome, 
    SUM(estoque.Estoque_produto) AS Estoque, 
    Periodicidade AS Periodicidade, 
    produtos.estoquemax_produto AS 'Média de venda mensal',
    IF(SUM(estoque.Estoque_produto) > produtos.estoquemax_produto * 2, 'Muito alto', IF(SUM(estoque.Estoque_produto) > produtos.estoquemax_produto , 'Alto', IF(SUM(estoque.Estoque_produto) > (produtos.estoquemax_produto / IF(Periodicidade = 'M' , 1 , IF(Periodicidade = 'Q' , 2 , 4))) *0.5, 'Bom', IF(SUM(estoque.Estoque_produto) > (produtos.estoquemax_produto / IF(Periodicidade = 'M' , 1 , IF(Periodicidade = 'Q' , 2 , 4))) * 0.3, 'Baixo', IF(SUM(estoque.Estoque_produto) >  0, 'Crítico', 'Zerado'))))) AS Estado, 
    precos.Custo_produto AS Custo, 
    produtos.fornecedor_principal AS Fornecedor,
    Descricao_produto AS 'Marca/Laboratório', 
    grupos_prod.Nome_grupo AS Grupo, 
    subgrupos.Nome AS Subgrupo

    FROM genius.produtos
    JOIN produtos_estoque AS estoque ON produtos.id = estoque.id_produto
    JOIN produtos_precos AS precos ON produtos.id = precos.id_produto
    JOIN subgruposprodutos AS subgrupos ON produtos.Id_grupo = subgrupos.Id
    JOIN grupos_produtos AS grupos_prod ON subgrupos.id_grupo = grupos_prod.Id
    GROUP BY Id
)d
WHERE d.Estado = 'Alto'
  • Thank you very much, that’s right. I only had a doubt, the "d" after parentheses should not need an AS?

  • and that way I could add some more JOIN? for example: JOIN d.id = other_table.id

  • 1

    you can use the AS without problem, it is also possible to do the JOIN. have this example with something similar

  • 1

    Thank you Goku also helped, if you need a force in Genki Dama we are ai lol kkk

0

Assign the clause WHERE within the tests you do before assigning the alias.

I believe this will work.

  • 2

    did not understand, you say change the clause position to after the IF condition()?

  • Low', IF(SUM(stock.Stock_product) > 0, 'Critical', 'Zero') Where status = 'high'))

  • This did not work, the error becomes syntax

Browser other questions tagged

You are not signed in. Login or sign up in order to post.