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

3

I wrote this 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 it returns me the error:

  

Error Code: 1054. Unknown column 'Status' in 'where clause'

The problem is that the State column is given as a result of this 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,

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

WHERE Estado = 'Alto'

Does anyone know how to solve this?

    
asked by anonymous 26.09.2016 / 15:38

2 answers

2

Make a subselect , your Status column, 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) only exists 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'
    
26.09.2016 / 16:28
1

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

I believe this will work.

    
26.09.2016 / 15:45