[RESOLVIDO] Soma de coluna com critério

Gostaria de saber se é possível:

SELECT coluna1, coluna2, SUM(coluna3) se valor de coluna4 = 'bom', SUM(coluna3) se valor da coluna4 = 'ruim' FROM tabela WHERE condição;

Não sei se da pra entender, mas preciso somar uma coluna sendo apresentado em duas colunas. Cada soma depende do valor de outra coluna.

Use CASE WHEN…

SELECT 
  coluna1, coluna2, 
  SUM(CASE WHEN coluna4 = 'bom' OR 
      coluna4 = 'ruim' THEN coluna3 ELSE 0 END) 
FROM tabela WHERE condição;

Agora se precisar somar e apresentar apenas os bons ou ruins pode fazer assim também…

SELECT coluna1, coluna2, SUM(coluna3) 
FROM tabela WHERE coluna4 = 'bom' OR coluna4 = 'ruim';

Outra forma…

SELECT coluna1, coluna2, SUM(coluna3) 
FROM tabela WHERE coluna4 IN ('bom', 'ruim');
1 curtida

Essa primeira opção é muito boa, porém só da certo assim:

SELECT SUM(CASE WHEN nome LIKE ‘%Vaz%’ THEN id ELSE 0 END) AS ID
FROM comprador
WHERE nome LIKE ‘%J%’;

se eu tentar colocar outras colunas da erro:

SELECT SUM(CASE WHEN nome LIKE ‘%Vaz%’ THEN id ELSE 0 END) AS ID, cpf, nome
FROM comprador
WHERE nome LIKE ‘%J%’;

Dá erro porque a função SUM, assim como COUNT, AVG, etc… são funções de agrupamento

Quando se usa mais de uma coluna junto a elas, obrigagoriamente você precisa usar GROUP BY no final…

SELECT SUM(CASE WHEN nome LIKE '%Vaz%' THEN id ELSE 0 END) AS ID, cpf, nome
FROM comprador WHERE nome LIKE '%J%' GROUP BY id, cpf, nome

Isso vai agrupar seguindo essa regra, por exemplo…

ID | CPF | NOME
1  | 123 | JOSE
2  | 345 | MARIA
1  | 123 | JOSE

Com o agrupamento vai ficar algo como…

ID | CPF | NOME  | SUM
1  | 123 | JOSE  | 2
2  | 345 | MARIA | 1

Agora uma observação, somar ID não faz muito sentido, ideal para esse campo (minha opinião ok?) seria usar COUNT, soma usa-se para campos de quantidade, dinheiro, etc, pense a respeito e aplique o correto a cada caso, bons estudos…

1 curtida

Eu usei como exemplo, mas a tabela que vou usar vai somar os litros de água consumido em uma ordem de produção.
Deu certo o que você disse. Perfeito, porém uma ordem de produção terá vários processos e eu quero mostrar as informações dessa ordem de produção, em uma única linha e nas duas últimas colunas mostrar as somas.
Ex. uma ordem de produção x:

    ID | PRODUTO| COR     | QUANTIDADE| DEFEITO_COR| DEFEITO_FURO
    1  | Calça  | Branco  | 50        | 12         | 30

Não seria sobre isso minha tabela, mas ilustra bem.
Terá vários registros da mesma ordem de produção, ai preciso mostrar as informações dela colocando essa soma no final. E essa soma viria da coluna DEFEITOS de uma tabela.
Deu pra entender?

Continua valendo a regra de agrupamento como disse anteriormente, afinal, usando esse ultimo exemplo você precisa saber quantas calças brancas, depois quantas calças pretas, calças azuis, etc, onde cada uma será uma linha de um agrupado, deu pra entender?

Quanto a ordem das colunas, basta colocá-las conforme a regra, não importa se a soma será no início ou no final, o que interessa é o que será apresentado junto a ela, precisa ser agrupado… e para cada defeito você usaria um case como mostrei algo assim…

SELECT 
  ID, PRODUTO, COR, 
  COUNT(ID) AS QUANTIDADE,
  SUM(CASE WHEN DEFEITO = 'COR' THEN 1 ELSE 0 END) AS DEFEITO_COR,
  SUM(CASE WHEN DEFEITO = 'FURO' THEN 1 ELSE 0 END) AS DEFEITO_FURO
FROM TABELA
GROUP BY ID, PRODUTO, COR

ID  |  PRODUTO  |  COR   | QTD  |  DC  |  DF
1   | Calça     | Branco | 50   | 12   | 30
2   | Calça     | Preta  | 20   | 10   | 10
3   | Calça     | Azul   | 100  | 50   | 20

Se amanhã ou depois você precisar apresentar junto o modelo/tecido (jeans, moleton, etc) da calça por exemplo, já sabe que também precisa agrupá-lo…

A partir dessas informações, é só ajustar à sua regra de negócio e seus critérios… boa sorte!

1 curtida

Tabela defeito:

ID| PRODUTO| COR      | QTD | QTD_DEFEITO_COR| DEFEITO
1 | Calça  | Vermelho | 20  | 4              | DEFEITO_FURO
2 | Calça  | Vermelho | 40  | 4              | DEFEITO_FURO
3 | Calça  | Vermelho | 10  | 2              | DEFEITO_COR
4 | Calça  | Vermelho | 12  | 6              | DEFEITO_COR

Preciso apresentar as informações da calça vermelho com o total de cada defeito:

PRODUTO| DEFEITO_COR| DEFEITO_FURO
Calça  | 8          | 8

E o que acontece é que vem todos os registros da calça e não apenas um com os totais.

Cara, desculpa! Eu estava tentando com um banco de dados exemplo e agora fiz com o real.
Funcionou perfeitamente. Muito obrigado pela ajuda!

1 curtida