Database
 sql >> Base de Dados >  >> RDS >> Database

SQL SUM() para iniciantes


Em SQL, o SUM() function é uma função agregada que retorna a soma de todos os valores em uma determinada expressão.

Também pode ser usado para retornar a soma de todos os valores distintos (exclusivos) em uma expressão.

A expressão deve ser numérica (não pode ser cadeia de caracteres, cadeia de bits ou data e hora).

Abaixo estão alguns exemplos básicos para demonstrar como funciona.

Tabela de amostra


Suponha que temos a seguinte tabela:
SELECT * FROM Products;

Resultado:
+-------------+------------+---------------------------------+----------------+-----------------------------------------+
| ProductId   | VendorId   | ProductName                     | ProductPrice   | ProductDescription                      |
|-------------+------------+---------------------------------+----------------+-----------------------------------------|
| 1           | 1001       | Left handed screwdriver         | 25.99          | Purple. Includes left handed carry box. |
| 2           | 1001       | Long Weight (blue)              | 14.75          | Includes a long wait.                   |
| 3           | 1001       | Long Weight (green)             | 11.99          | Approximate 30 minute waiting period.   |
| 4           | 1002       | Sledge Hammer                   | 33.49          | Wooden handle. Free wine glasses.       |
| 5           | 1003       | Chainsaw                        | 245.00         | Orange. Includes spare fingers.         |
| 6           | 1003       | Straw Dog Box                   | NULL           | Tied with vines. Very chewable.         |
| 7           | 1004       | Bottomless Coffee Mugs (4 Pack) | 9.99           | Brown ceramic with solid handle.        |
| 8           | 1001       | Right handed screwdriver        | 25.99          | Blue. Includes right handed carry box.  |
+-------------+------------+---------------------------------+----------------+-----------------------------------------+

Exemplo


Podemos usar a seguinte consulta para obter a soma de todos os preços.
SELECT SUM(ProductPrice)
FROM Products;

Resultado:
+--------------------+
| (No column name)   |
|--------------------|
| 367.20             |
+--------------------+

Nesse caso, as informações de preço são armazenadas no ProductPrice coluna, e então passamos isso como um argumento para o SUM() função, que então calcula a soma e retorna o resultado.

Usando aliases de coluna


Você notará que os resultados anteriores não incluem um nome de coluna. Isso é esperado, porque o SUM() A função não retorna nenhuma coluna. Você pode fornecer facilmente um nome de coluna atribuindo um alias.
SELECT SUM(ProductPrice) AS Sum
FROM Products;

Resultado:
+--------+
| Sum    |
|--------|
| 367.20 |
+--------+

Resultados filtrados


A SUM() A função opera nas linhas retornadas pela consulta. Então, se você filtrar os resultados, o resultado de SUM() vai refletir isso.
SELECT SUM(ProductPrice) AS Sum
FROM Products
WHERE VendorId = 1001;

Resultado:
+-------+
| Sum   |
|-------|
| 78.72 |
+-------+

Nesse caso, 78,72 é a soma de todos os produtos oferecidos pelo fornecedor especificado.

NULL Valores


A SUM() função ignora qualquer NULL valores. Em nossa tabela de amostra acima, número do produto 6 tem NULL em seu ProductPrice coluna, mas isso foi ignorado em nosso SUM() exemplo.

Dependendo de seu DBMS e suas configurações, você pode ou não ver um aviso de que NULL valores foram eliminados no conjunto de resultados.

Aqui está um exemplo do que você pode ver:
SELECT SUM(ProductPrice) AS Sum
FROM Products;

Resultado:
+--------+
| Sum    |
|--------|
| 367.20 |
+--------+
Warning: Null value is eliminated by an aggregate or other SET operation.

Tudo isso nos diz que a coluna continha pelo menos um NULL valor, e que foi ignorado no cálculo dos resultados.

Dados de data/hora


A SUM() função não aceita expressões de data/hora.

Suponha que temos a seguinte tabela:
SELECT PetName, DOB 
FROM Pets;

Resultado:
+-----------+------------+
| PetName   | DOB        |
|-----------+------------|
| Fluffy    | 2020-11-20 |
| Fetch     | 2019-08-16 |
| Scratch   | 2018-10-01 |
| Wag       | 2020-03-15 |
| Tweet     | 2020-11-28 |
| Fluffy    | 2020-09-17 |
| Bark      | NULL       |
| Meow      | NULL       |
+-----------+------------+

Se tentarmos usar SUM() no DOB coluna, obteremos um erro.
SELECT SUM(DOB) AS Sum
FROM Pets;

Resultado:
Msg 8117, Level 16, State 1, Line 1
Operand data type date is invalid for sum operator.

Dados de caracteres


A SUM() A função também não aceita expressões de cadeia de caracteres.

Aqui está o que acontece se tentarmos usar SUM() no ProductName coluna de nossos Products table (que usa um tipo de dados de varchar):
SELECT SUM(ProductName) AS Sum
FROM Products;

Resultado:
Msg 8117, Level 16, State 1, Line 1
Operand data type varchar is invalid for sum operator.

O DISTINCT Palavra-chave


Você pode usar o DISTINCT palavra-chave com SUM() para calcular apenas valores distintos. Ou seja, se houver valores duplicados, eles serão tratados como um valor.

Exemplo:
SELECT SUM(DISTINCT ProductPrice) AS DistinctSum
FROM Products;

Resultado:
+---------------+
| DistinctSum   |
|---------------|
| 341.21        |
+---------------+

Podemos ver que este resultado é inferior ao resultado obtido sem o DISTINCT palavra-chave.

Para recapitular, temos 367.20 sem o DISTINCT palavra-chave e 341.21 com o DISTINCT palavra-chave.

Isso ocorre porque existem dois itens que compartilham o mesmo preço (a chave de fenda para canhotos e a chave de fenda para destros custam 25,99). Portanto, o SUM() função, quando usado com o DISTINCT palavra-chave, trata ambos os valores como um e calcula seu resultado de acordo.

Funções da janela


Dependendo do seu DBMS, você pode usar um OVER cláusula com seu SUM() função para criar uma função de janela.

Uma função de janela executa uma operação semelhante à agregação em um conjunto de linhas de consulta. Ele produz um resultado para cada linha da consulta. Isso contrasta com uma operação agregada, que agrupa linhas de consulta em uma única linha de resultado.

Aqui está um exemplo para demonstrar o conceito.

Já vimos os Products tabela. Nosso banco de dados também possui um Customers tabela e contém os seguintes dados:
+--------------+----------------------+-------------------+------------+-----------------+------------+-----------+----------------+
| CustomerId   | CustomerName         | PostalAddress     | City       | StateProvince   | ZipCode    | Country   | Phone          |
|--------------+----------------------+-------------------+------------+-----------------+------------+-----------+----------------+
| 1001         | Palm Pantry          | 20 Esplanade      | Townsville | QLD             | 2040       | AUS       | (308) 555-0100 |
| 1002         | Tall Poppy           | 12 Main Road      | Columbus   | OH              | 43333      | USA       | (310) 657-0134 |
| 1003         | Crazy Critters       | 10 Infinite Loops | Cairns     | QLD             | 4870       | AUS       | (418) 555-0143 |
| 1004         | Oops Media           | 4 Beachside Drive | Perth      | WA              | 1234       | AUS       | (405) 443-5987 |
| 1005         | Strange Names Inc.   | 789 George Street | Sydney     | NSW             | 2000       | AUD       | (318) 777-0177 |
| 1006         | Hi-Five Solutionists | 5 High Street     | Highlands  | HI              | 1254       | AUS       | (415) 413-5182 |
+--------------+----------------------+-------------------+------------+-----------------+------------+-----------+----------------+

Podemos recuperar dados dessas tabelas e apresentá-los como um conjunto de resultados usando uma junção.

Também podemos usar o SUM() função com o OVER cláusula para aplicar uma função de janela aos dados.
SELECT 
    v.VendorName,
    p.ProductName,
    p.ProductPrice,
    SUM(ProductPrice) OVER (PARTITION BY v.VendorName) AS "Sum For This Vendor"
FROM Products p 
INNER JOIN Vendors v 
ON v.VendorId = p.VendorId
ORDER BY VendorName, ProductPrice, "Sum For This Vendor";

Resultado:
+---------------+---------------------------------+----------------+-----------------------+
| VendorName    | ProductName                     | ProductPrice   | Sum For This Vendor   |
|---------------+---------------------------------+----------------+-----------------------|
| Katty Kittens | Bottomless Coffee Mugs (4 Pack) | 9.99           | 9.99                  |
| Mars Supplies | Long Weight (green)             | 11.99          | 78.72                 |
| Mars Supplies | Long Weight (blue)              | 14.75          | 78.72                 |
| Mars Supplies | Right handed screwdriver        | 25.99          | 78.72                 |
| Mars Supplies | Left handed screwdriver         | 25.99          | 78.72                 |
| Pedal Medals  | Straw Dog Box                   | NULL           | 245.00                |
| Pedal Medals  | Chainsaw                        | 245.00         | 245.00                |
| Randy Roofers | Sledge Hammer                   | 33.49          | 33.49                 |
+---------------+---------------------------------+----------------+-----------------------+

Neste caso usamos o OVER cláusula com nossa SUM() função para particionar o resultado pelo nome do fornecedor.

Ao fazer isso, conseguimos retornar as informações de preço de cada produto, bem como a soma de todos os produtos desse fornecedor. A soma muda conforme o fornecedor muda (a menos que vários fornecedores tenham a mesma soma), mas permanece a mesma para todos os produtos do mesmo fornecedor.

Este conceito também pode ser aplicado a outras funções agregadas em SQL, como AVG() , MIN() , MAX() e COUNT() .