Database
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Database

SQL SUM () cho người mới bắt đầu

Trong SQL, SUM() hàm là một hàm tổng hợp trả về tổng của tất cả các giá trị trong một biểu thức nhất định.

Nó cũng có thể được sử dụng để trả về tổng của tất cả các giá trị khác biệt (duy nhất) trong một biểu thức.

Biểu thức phải là số (nó không thể là chuỗi ký tự, chuỗi bit hoặc ngày giờ).

Dưới đây là một số ví dụ cơ bản để chứng minh cách hoạt động của nó.

Bảng mẫu

Giả sử chúng ta có bảng sau:

SELECT * FROM Products;

Kết quả:

+-------------+------------+---------------------------------+----------------+-----------------------------------------+
| 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.  |
+-------------+------------+---------------------------------+----------------+-----------------------------------------+

Ví dụ

Chúng tôi có thể sử dụng truy vấn sau để nhận tổng của tất cả các mức giá.

SELECT SUM(ProductPrice)
FROM Products;

Kết quả:

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

Trong trường hợp này, thông tin giá được lưu trữ trong ProductPrice và do đó chúng tôi chuyển nó làm đối số cho SUM() hàm, sau đó sẽ tính tổng và trả về kết quả.

Sử dụng bí danh cột

Bạn sẽ nhận thấy rằng các kết quả trước đó không bao gồm tên cột. Điều này được mong đợi, vì SUM() hàm không trả về bất kỳ cột nào. Bạn có thể dễ dàng cung cấp tên cột bằng cách gán bí danh.

SELECT SUM(ProductPrice) AS Sum
FROM Products;

Kết quả:

+--------+
| Sum    |
|--------|
| 367.20 |
+--------+

Kết quả được lọc

SUM() hàm hoạt động trên các hàng được trả về bởi truy vấn. Vì vậy, nếu bạn lọc kết quả, kết quả là SUM() sẽ phản ánh điều đó.

SELECT SUM(ProductPrice) AS Sum
FROM Products
WHERE VendorId = 1001;

Kết quả:

+-------+
| Sum   |
|-------|
| 78.72 |
+-------+

Trong trường hợp này, 78,72 là tổng của tất cả các sản phẩm được cung cấp bởi nhà cung cấp được chỉ định.

NULL Giá trị

SUM() hàm bỏ qua bất kỳ NULL nào các giá trị. Trong bảng mẫu của chúng tôi ở trên, số sản phẩm 6 đã có NULL trong ProductPrice của nó nhưng cột đó đã bị bỏ qua trong SUM() của chúng tôi ví dụ.

Tùy thuộc vào DBMS và cài đặt của bạn, bạn có thể thấy hoặc không thấy cảnh báo rằng NULL các giá trị đã bị loại bỏ trong tập kết quả.

Dưới đây là một ví dụ về những gì bạn có thể thấy:

SELECT SUM(ProductPrice) AS Sum
FROM Products;

Kết quả:

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

Tất cả những gì điều này cho chúng ta biết là cột chứa ít nhất một NULL và nó đã bị bỏ qua khi tính toán kết quả.

Dữ liệu ngày / giờ

SUM() hàm không chấp nhận các biểu thức ngày / giờ.

Giả sử chúng ta có bảng sau:

SELECT PetName, DOB 
FROM Pets;

Kết quả:

+-----------+------------+
| 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       |
+-----------+------------+

Nếu chúng tôi cố gắng sử dụng SUM() trên DOB , chúng tôi sẽ gặp lỗi.

SELECT SUM(DOB) AS Sum
FROM Pets;

Kết quả:

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

Dữ liệu ký tự

SUM() hàm cũng không chấp nhận các biểu thức chuỗi ký tự.

Đây là những gì sẽ xảy ra nếu chúng tôi cố gắng sử dụng SUM() trên ProductName cột Products của chúng tôi bảng (sử dụng kiểu dữ liệu varchar):

SELECT SUM(ProductName) AS Sum
FROM Products;

Kết quả:

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

DISTINCT Từ khóa

Bạn có thể sử dụng DISTINCT từ khóa với SUM() để chỉ tính các giá trị riêng biệt. Nghĩa là, nếu có bất kỳ giá trị trùng lặp nào, chúng được coi là một giá trị.

Ví dụ:

SELECT SUM(DISTINCT ProductPrice) AS DistinctSum
FROM Products;

Kết quả:

+---------------+
| DistinctSum   |
|---------------|
| 341.21        |
+---------------+

Chúng ta có thể thấy rằng kết quả này thấp hơn kết quả mà chúng ta nhận được khi không có DISTINCT từ khóa.

Tóm lại, chúng tôi nhận được 367,20 mà không có DISTINCT từ khóa và 341,21 với DISTINCT từ khóa.

Điều này là do có hai mặt hàng có cùng mức giá (tuốc nơ vít thuận tay trái và tuốc nơ vít tay phải đều có giá 25,99). Do đó, SUM() , khi được sử dụng với DISTINCT từ khóa, coi cả hai giá trị đó là một và tính toán kết quả của nó cho phù hợp.

Chức năng cửa sổ

Tùy thuộc vào DBMS của bạn, bạn có thể sử dụng OVER mệnh đề với SUM() của bạn chức năng tạo một chức năng cửa sổ.

Một hàm cửa sổ thực hiện một hoạt động giống như tổng hợp trên một tập hợp các hàng truy vấn. Nó tạo ra một kết quả cho mỗi hàng truy vấn. Điều này trái ngược với hoạt động tổng hợp, nhóm các hàng truy vấn thành một hàng kết quả duy nhất.

Dưới đây là một ví dụ để chứng minh khái niệm này.

Chúng tôi đã thấy Products bàn. Cơ sở dữ liệu của chúng tôi cũng có Customers và nó chứa dữ liệu sau:

+--------------+----------------------+-------------------+------------+-----------------+------------+-----------+----------------+
| 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 |
+--------------+----------------------+-------------------+------------+-----------------+------------+-----------+----------------+

Chúng tôi có thể truy xuất dữ liệu từ các bảng này và trình bày chúng dưới dạng một tập hợp kết quả bằng cách sử dụng phép nối.

Chúng tôi cũng có thể sử dụng SUM() chức năng với OVER để áp dụng một hàm cửa sổ cho dữ liệu.

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";

Kết quả:

+---------------+---------------------------------+----------------+-----------------------+
| 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                 |
+---------------+---------------------------------+----------------+-----------------------+

Trong trường hợp này, chúng tôi đã sử dụng OVER mệnh đề với SUM() của chúng tôi chức năng phân vùng kết quả theo tên nhà cung cấp.

Bằng cách này, chúng tôi có thể trả lại thông tin giá cho từng sản phẩm, cũng như tổng tất cả các sản phẩm từ nhà cung cấp nhất định đó. Tổng thay đổi khi nhà cung cấp thay đổi (trừ khi nhiều nhà cung cấp có cùng tổng), nhưng vẫn giữ nguyên cho tất cả các sản phẩm từ cùng một nhà cung cấp.

Khái niệm này cũng có thể được áp dụng cho các hàm tổng hợp khác trong SQL, chẳng hạn như AVG() , MIN() , MAX()COUNT() .


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. T-SQL Thứ ba # 65:Dạy một cái gì đó mới

  2. Các tính năng không dùng nữa để đưa ra khỏi hộp công cụ của bạn - Phần 1

  3. Lập kế hoạch dung lượng đĩa cho cơ sở dữ liệu

  4. Lầm tưởng rằng DROP và TRUNCATE TABLE không được ghi nhật ký

  5. Chốt APPEND_ONLY_STORAGE_INSERT_POINT