Somar valores linha

16/04/2023

0

Bom dia, tenho uma tabela que em cada linha tem um vendedor, os vendedores tem nomes únicos. Depois tenho as colunas com as vendas de janeiro, fevereiro e março. Em seguida uma coluna com a meta de vendas. Por fim uma coluna que tenho que preencher com sim caso bateu a meta e não caso não bateu. O problema é que quando uso SUM para somar, ele soma a coluna janeiro toda, em vez de somar janeiro, fevereiro e março de cada um. Conseguem me ajudar por favor.
Eliton Silva

Eliton Silva

Responder

Post mais votado

17/04/2023

A coluna Vendedor foi definida como TEXT. Porém, é mais adequado que seja do tipo VARCHAR(<tamanho máximo>).

O tipo TEXT serve para armazenar textos grandes, geralmente de até 2 GB e, portanto, não é indexável e não vai aceitar a constraint de PK ou Unique, que garantiria a unicidade do vendedor.

Neste caso, trata-se de um modelo hipotético para exercitar o aprendizado, onde após inserir os dados de vários vendedores, você precisa atualizar as colunas TotalTri e AtingiuMeta.

A característica de "vendedores únicos" aqui, estou interpretando como sendo uma constraint que impede que múltiplas linhas sejam inseridas para o mesmo vendedor, o que poderia implicar uma inconsistência com valores distintos entre eles. Então, se não há múltiplas linhas por vendedor, não há necessidade de uso de funções de agregação.

Basta um update, mais ou menos assim:

update `Super7`.`Vendas` set
  `TotalTri` = `Jan`+`Fev`+`Mar`,
  `AtingiuMeta` = case when (`Jan`+`Fev`+`Mar`)>=`Meta` then 'sim' else 'não' end;

Arthur Heinrich

Arthur Heinrich
Responder

Mais Posts

16/04/2023

Frank Hosaka

O primeiro problema é ver a cara da tabela, eu suponho que seja assim:

tbvenda
id
idvendedor
data
venda

Para ver a venda de cada mês, de cada vendedor, a consulta seria assim:

select sum(venda),idvendedor,month(data) from tbvenda where data>'2022-12-31' group by idvendedor

Para ver a venda de cada vendedor no ano de 2023, a consulta seria assim:

select sum(venda),idvendedor from tbvenda where data>'2022-12-31' group by idvendedor

Para ver tudo isso de uma vez, aí seria necessário um view, assim:

CREATE 
VIEW vw_venda AS
    SELECT 
        id_vendedor,
        SUM(IF((MONTH(data) = 1),venda,0)) as jan,
        SUM(IF((MONTH(data) = 2),venda,0)) as fev,
        SUM(IF((MONTH(data) = 3),venda,0)) as mar,
        SUM(IF((MONTH(data) = 4),venda,0)) as abr,
        SUM(IF((MONTH(data) = 5),venda,0)) as mai,
        SUM(IF((MONTH(data) = 6),venda,0)) as jun,
        SUM(IF((MONTH(data) = 7),venda,0)) as jul,
        SUM(IF((MONTH(data) = 8),venda,0)) as ago,
        SUM(IF((MONTH(data) = 9),venda,0)) as "set",
        SUM(IF((MONTH(data) = 10),venda,0)) as "out",
        SUM(IF((MONTH(data) = 11),venda,0)) as nov,
        SUM(IF((MONTH(data) = 12),venda,0)) as dez,
        SUM(venda) AS `2023`
    FROM
        vendas
    where data > '2022-12-31'
    GROUP BY id_vendedor


Responder

17/04/2023

Eliton Silva

Oi bom dia,

Desculpe não ter colocado a tabela, segue abaixo.

CREATE TABLE `Super7`.`Vendas` ( `Vendedor` TEXT NOT NULL ,  `Jan` INT  ,  `Fev` INT  ,  `Mar` INT  ,  `TotalTri` INT  ,  `Meta` INT  ,  `AtingiuMeta` TEXT  ) ENGINE = InnoDB;
INSERT INTO `Vendas` (`Vendedor`, `Jan`, `Fev`, `Mar`, `TotalTri`, `Meta`, `AtingiuMeta`) VALUES ('Jose', '1000', '100', '200', '0', '1000', ''), ('Pedro', '100', '100', '300', '0', '1000', '')


Eu preciso somar os valores que Jose vendeu e colocar em "TotralTri", depois comparar com a "Meta" e colocar sim ou não em "AtingiuMeta".

Obrigado pela ajuda.



O primeiro problema é ver a cara da tabela, eu suponho que seja assim:

tbvenda
id
idvendedor
data
venda

Para ver a venda de cada mês, de cada vendedor, a consulta seria assim:

select sum(venda),idvendedor,month(data) from tbvenda where data>'2022-12-31' group by idvendedor

Para ver a venda de cada vendedor no ano de 2023, a consulta seria assim:

select sum(venda),idvendedor from tbvenda where data>'2022-12-31' group by idvendedor

Para ver tudo isso de uma vez, aí seria necessário um view, assim:

CREATE 
VIEW vw_venda AS
    SELECT 
        id_vendedor,
        SUM(IF((MONTH(data) = 1),venda,0)) as jan,
        SUM(IF((MONTH(data) = 2),venda,0)) as fev,
        SUM(IF((MONTH(data) = 3),venda,0)) as mar,
        SUM(IF((MONTH(data) = 4),venda,0)) as abr,
        SUM(IF((MONTH(data) = 5),venda,0)) as mai,
        SUM(IF((MONTH(data) = 6),venda,0)) as jun,
        SUM(IF((MONTH(data) = 7),venda,0)) as jul,
        SUM(IF((MONTH(data) = 8),venda,0)) as ago,
        SUM(IF((MONTH(data) = 9),venda,0)) as "set",
        SUM(IF((MONTH(data) = 10),venda,0)) as "out",
        SUM(IF((MONTH(data) = 11),venda,0)) as nov,
        SUM(IF((MONTH(data) = 12),venda,0)) as dez,
        SUM(venda) AS `2023`
    FROM
        vendas
    where data > '2022-12-31'
    GROUP BY id_vendedor


Responder

17/04/2023

Frank Hosaka

O que você está tentando fazer é uma planilha dentro do banco de dados. Isso não funciona.
Cada tabela tem que representar uma informação do mundo real.
Maria vendeu 10,00 em janeiro de 2023.
João vendeu 20,00 em janeiro de 2023.
Pedro vendeu 12,00 em janeiro de 2023.

Para incluir essas informações, o comando é esse:
insert into vendas vendedor, data, venda values (''Maria'',''2023-01-31'',10.00),(''João'',''2023-01-31'',20.00),(''Pedro'',''2023-01-31'',12.00).
Aqui eu tenho um campo para vendedor, outro campo para data e outra para venda.
Para saber o que a Maria vendeu em 2023, você usa uma consulta assim:
select sum(venda) from venda where vendedor = ''Maria''
Para saber o que a Maria vendeu por mês em 2023, você usa outra consulta assim:
select month(data), sum(venda) from venda where vendedor=''Maria''
Para saber o que os vendedores venderam por mês em 2023, você usa outra consulta assim:
select month(data),sum(venda) from venda group by vendedor.

Ou seja, você precisa separar a tabela (a fonte da informação) da consulta (como você apresenta a informação).
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar