Mệnh đề GROUP BY là một câu lệnh mạnh mẽ nhưng đôi khi khó nghĩ. Thậm chí tám năm sau, mỗi khi tôi sử dụng GROUP BY, tôi phải dừng lại và nghĩ về những gì nó thực sự đang làm. Trong bài viết này, chúng ta sẽ xem xét cách tạo mệnh đề GROUP BY, điều gì

Bạn đang xem: sql sum và nhóm theo

GROUP BY Mệnh đề là một tuyên bố mạnh mẽ nhưng đôi khi khó nghĩ.

Thậm chí tám năm sau, mỗi khi tôi sử dụng GROUP BY , tôi phải dừng lại và suy nghĩ về điều gì nó thực sự đang hoạt động.

Trong bài viết này, chúng ta sẽ xem xét cách tạo mệnh đề GROUP BY , nó có tác dụng gì với truy vấn của bạn và cách bạn có thể sử dụng nó để thực hiện tổng hợp và thu thập thông tin chi tiết về dữ liệu của bạn.

Dưới đây là những gì chúng tôi sẽ trình bày:

Thiết lập cơ sở dữ liệu của bạn

Trước khi chúng tôi có thể viết các truy vấn của mình, chúng tôi cần thiết lập cơ sở dữ liệu của mình.

Đối với những ví dụ này, chúng tôi sẽ là chúng tôi ing PostgreSQL, nhưng các truy vấn và khái niệm hiển thị ở đây sẽ dễ dàng dịch sang bất kỳ hệ thống cơ sở dữ liệu hiện đại nào khác (như MySQL, SQL Server, v.v.).

Để làm việc với cơ sở dữ liệu PostgreSQL, chúng ta có thể sử dụng psql —chương trình dòng lệnh PostgreSQL tương tác. Nếu bạn có một ứng dụng khách cơ sở dữ liệu khác mà bạn cũng thích làm việc với nó.

Để bắt đầu, hãy tạo cơ sở dữ liệu của chúng tôi. Với PostgreSQL đã được cài đặt, chúng tôi có thể chạy lệnh createdb & lt; database-name & gt; tại thiết bị đầu cuối của mình để tạo cơ sở dữ liệu mới. Tôi đã gọi là fcc :

  $ createb fcc
 

Tiếp theo, hãy khởi động bảng điều khiển tương tác bằng cách sử dụng lệnh psql và kết nối với cơ sở dữ liệu chúng ta vừa tạo bằng \ c & lt; database-name & gt; :

  $ psql
psql (11,5)
Gõ "help" để được trợ giúp.

john = # \ c fcc
Bây giờ bạn được kết nối với cơ sở dữ liệu "fcc" với tư cách là người dùng "john".
fcc = #
 

Lưu ý: Tôi đã xóa đầu ra psql trong các ví dụ này để dễ đọc hơn, vì vậy đừng lo lắng nếu kết quả hiển thị ở đây không chính xác như những gì bạn đã thấy trong thiết bị đầu cuối của mình.

Tôi khuyến khích bạn làm theo các ví dụ này và tự chạy các truy vấn này. Bạn sẽ học và nhớ nhiều hơn khi làm việc với những ví dụ này thay vì chỉ đọc chúng.

Thiết lập dữ liệu (tạo doanh số bán hàng) < / h2>

Đối với các ví dụ của chúng tôi, chúng tôi sẽ sử dụng một bảng lưu trữ hồ sơ bán hàng của các sản phẩm khác nhau ở các vị trí cửa hàng khác nhau.

Chúng tôi sẽ gọi bảng này là doanh số , và nó sẽ là một mô tả đơn giản về doanh số bán hàng tại cửa hàng: tên địa điểm, tên sản phẩm, giá cả và thời gian nó được bán.

Nếu chúng tôi tạo bảng này trong một ứng dụng thực, chúng tôi sẽ thiết lập chìa khóa đến các bảng khác (như vị trí hoặc sản phẩm ). Nhưng để minh họa các khái niệm GROUP BY , chúng tôi sẽ chỉ sử dụng các cột TEXT đơn giản.

Hãy tạo bảng và chèn một số dữ liệu bán hàng:

  TẠO BẢNG bán hàng (
  vị trí TEXT,
  sản phẩm TEXT,
  giá DECIMAL,
  sold_at TIMESTAMP
);

CHÈN VÀO doanh số bán hàng (vị trí, sản phẩm, giá, đã bán) GIÁ TRỊ
('HQ', 'Coffee', 2, NOW ()),
('HQ', 'Coffee', 2, NOW () - INTERVAL '1 giờ'),
('Trung tâm thành phố', 'Bagel', 3, NOW () - INTERVAL '2 giờ'),
('Trung tâm thành phố', 'Cà phê', 2, NOW () - INTERVAL '1 ngày'),
('HQ', 'Bagel', 2, NOW () - INTERVAL '2 ngày'),
('Đường 1', 'Bánh mì', 3, NOW () - INTERVAL '2 ngày' - INTERVAL '1 giờ'),
('Phố 1', 'Cà phê', 2, NOW () - INTERVAL '3 ngày'),
('HQ', 'Bagel', 3, NOW () - INTERVAL '3 ngày' - INTERVAL '1 giờ');
 

Chúng tôi có ba địa điểm: HQ, Downtown và Phố 1.

Chúng tôi có hai sản phẩm, Coffee và Bagel, và chúng tôi chèn các doanh số bán hàng này bằng các khác nhau Các giá trị của sell_at để đại diện cho các mặt hàng đang được bán vào các ngày và thời gian khác nhau.

Có một số mặt hàng được bán vào hôm nay, một số ngày hôm qua và một số mặt hàng từ hôm trước.

GROUP BY hoạt động như thế nào?

Để minh họa cách hoạt động của mệnh đề GROUP BY , trước tiên chúng ta hãy nói về một ví dụ.

Hãy tưởng tượng chúng ta có một căn phòng đầy những người sinh ra ở các quốc gia khác nhau.

Nếu chúng ta muốn tìm chiều cao trung bình của những người trong phòng theo quốc gia, trước tiên chúng tôi sẽ yêu cầu những người này tách thành các nhóm dựa trên quốc gia sinh của họ.

Sau khi họ được tách thành nhóm của mình, chúng tôi có thể sau đó tính chiều cao trung bình trong nhóm đó.

Đây là cách mệnh đề GROUP BY hoạt động. Trước tiên, chúng tôi xác định cách chúng tôi muốn nhóm các hàng lại với nhau — sau đó chúng tôi có thể thực hiện các phép tính hoặc tổng hợp trên các nhóm.

Nhiều nhóm

Chúng tôi có thể nhóm dữ liệu thành nhiều nhóm hoặc nhóm phụ tùy ý.

Ví dụ: sau khi yêu cầu mọi người tách thành các nhóm dựa trên quốc gia sinh của họ, chúng tôi có thể cho biết từng nhóm quốc gia đó để tách thành các nhóm dựa trên màu mắt của họ.

Bằng cách này, chúng tôi có các nhóm người dựa trên sự kết hợp giữa quốc gia sinh và màu mắt của họ.

Giờ đây, chúng tôi có thể tìm thấy chiều cao trung bình trong mỗi nhóm nhỏ hơn này và chúng tôi sẽ có kết quả cụ thể hơn: chiều cao trung bình trên mỗi quốc gia trên mỗi màu mắt.

GROUP BY mệnh đề thường được sử dụng cho các trường hợp bạn có thể sử dụng cụm từ per something hoặc for each something:

  • Chiều cao trung bình của mỗi quốc gia sinh < / li>
  • Tổng số người cho từng sự kết hợp giữa màu mắt và màu tóc
  • Tổng doanh số trên mỗi sản phẩm

Viết mệnh đề GROUP BY

Một mệnh đề GROUP BY rất dễ dàng ghi — chúng tôi chỉ sử dụng các từ khóa GROUP BY và sau đó chỉ định (các) trường mà chúng tôi muốn nhóm theo:

  SELECT .. .
TỪ bán hàng
NHÓM THEO vị trí;  

Truy vấn đơn giản này nhóm dữ liệu bán hàng của chúng tôi theo cột vị trí .

Chúng tôi ' đã hoàn thành việc nhóm — nhưng chúng tôi đặt cái gì vào SELECT ?

Điều hiển nhiên cần chọn là vị trí của chúng tôi —chúng tôi đang nhóm theo nó vì vậy, ít nhất chúng tôi muốn xem tên của các nhóm mà chúng tôi đã tạo:

  CHỌN vị trí
TỪ bán hàng
NHÓM THEO vị trí;
 

Kết quả là ba vị trí của chúng tôi:

  vị trí
------------
 Đường số 1
 HQ
 Trung tâm thành phố
(3 hàng)
 

Nếu chúng ta nhìn vào dữ liệu bảng thô của mình ( SELECT * FROM sales; ), chúng ta sẽ thấy rằng chúng ta có bốn hàng với vị trí là HQ, hai các hàng có vị trí ở Trung tâm thành phố và hai hàng có vị trí là Phố 1:

  product | địa điểm | giá cả | bán_at
--------- + ------------ + ------- + ------------------- ---------
 Cà phê | HQ | 2 | 2020-09-01 09: 42: 33.085995
 Cà phê | HQ | 2 | 2020-09-01 08: 42: 33.085995
 Bánh mì tròn | Trung tâm thành phố | 3 | 2020-09-01 07: 42: 33.085995
 Cà phê | Trung tâm thành phố | 2 | 2020-08-31 09: 42: 33.085995
 Bánh mì tròn | HQ | 2 | 2020-08-30 09: 42: 33.085995
 Bánh mì tròn | Đường số 1 | 3 | 2020-08-30 08: 42: 33.085995
 Cà phê | Đường số 1 | 2 | 2020-08-29 09: 42: 33.085995
 Bánh mì tròn | HQ | 3 | 2020-08-29 08: 42: 33.085995
(8 hàng)
 

Bằng cách nhóm trên cột vị trí , cơ sở dữ liệu của chúng tôi lấy các hàng đầu vào này và xác định các vị trí duy nhất trong số chúng — những vị trí duy nhất này đóng vai trò là "nhóm" của chúng tôi. < / p>

Nhưng còn các cột khác trong bảng của chúng ta thì sao?

Nếu chúng ta cố gắng chọn một cột như product mà chúng ta không nhóm theo ... < / p>

  CHỌN
  địa điểm,
  sản phẩm
TỪ bán hàng
NHÓM THEO vị trí;
 

... chúng tôi gặp phải lỗi này:

  LỖI: cột "sales.product" phải xuất hiện trong mệnh đề GROUP BY hoặc được sử dụng trong chức năng tổng hợp
 

Vấn đề ở đây là chúng tôi đã lấy tám hàng và thu nhỏ hoặc giảm chúng xuống còn ba.

Chúng tôi không thể trả lại phần còn lại của các cột như bình thường —Chúng tôi có tám hàng và bây giờ chúng tôi có ba hàng.

Chúng tôi làm gì với năm hàng dữ liệu còn lại? Dữ liệu nào trong số tám hàng sẽ được hiển thị trên ba hàng vị trí riêng biệt này?

Không có câu trả lời rõ ràng và dứt khoát ở đây.

Để sử dụng phần còn lại của dữ liệu bảng, chúng tôi cũng phải tách dữ liệu từ các cột còn lại này thành ba nhóm vị trí của chúng tôi.

Điều này có nghĩa là chúng tôi phải tổng hợp hoặc thực hiện tính toán để tạo ra một số loại thông tin tóm tắt về dữ liệu còn lại của chúng tôi.

Tổng hợp ( COUNT , SUM , AVG )

Khi chúng tôi đã quyết định cách nhóm dữ liệu của chúng tôi, sau đó chúng tôi có thể thực hiện tổng hợp trên các cột còn lại.

Đây là những việc như đếm số hàng trên mỗi nhóm, tính tổng một giá trị cụ thể trong nhóm hoặc tính trung bình thông tin trong nhóm.

Để bắt đầu, hãy tìm số lần bán hàng cho mỗi vị trí.

Vì mỗi bản ghi trong bảng doanh số của chúng tôi là một lần bán hàng, nên số lần bán hàng cho mỗi vị trí sẽ là < strong> số lượng hàng trong mỗi nhóm vị trí.

Để làm điều này, chúng tôi sẽ sử dụng tổng hợp hàm COUNT () để đếm số hàng trong mỗi nhóm:

  SELECT
  địa điểm,
  COUNT (*) AS number_of_sales
TỪ bán hàng
NHÓM THEO vị trí;
 

Chúng tôi sử dụng COUNT (*) để đếm tất cả các hàng đầu vào cho một nhóm.

( COUNT () < / code> cũng hoạt động với các biểu thức, nhưng nó có hành vi hơi khác.)

Đây là cách cơ sở dữ liệu thực thi truy vấn này:

  • FROM sales - Đầu tiên, truy xuất tất cả các bản ghi từ bán hàng bảng
  • NHÓM THEO vị trí - Tiếp theo, xác định các nhóm vị trí duy nhất
  • CHỌN ... - Cuối cùng, chọn tên vị trí và số lượng hàng trong nhóm đó

Chúng tôi cũng đặt bí danh cho số hàng này bằng cách sử dụng AS number_of_sales để làm cho đầu ra dễ đọc hơn. Nó trông giống như sau:

  location | number_of_sales
------------ + -----------------
 Đường số 1 | 2
 HQ | 4
 Trung tâm thành phố | 2
(3 hàng)
 

Vị trí Phố 1 có hai doanh số, HQ có bốn doanh số và Trung tâm thành phố có hai doanh số.

Tại đây, chúng tôi có thể xem cách chúng tôi lấy dữ liệu cột còn lại từ tám hàng độc lập và chắt lọc chúng thành thông tin tóm tắt hữu ích cho từng vị trí: số lần bán hàng.

SUM

Theo cách tương tự , thay vì đếm số hàng trong một nhóm, chúng tôi có thể tổng hợp thông tin trong nhóm — chẳng hạn như tổng số tiền kiếm được từ các vị trí đó.

Để làm điều này, chúng tôi sẽ sử dụng SUM () hàm:

  CHỌN
  địa điểm,
  SUM (giá) AS total_revenue
TỪ bán hàng
NHÓM THEO vị trí;
 

Thay vì đếm số hàng trong mỗi nhóm, chúng tôi tính tổng số tiền của mỗi lần bán hàng và điều này cho chúng tôi thấy tổng doanh thu trên mỗi vị trí:

  địa điểm | Tổng doanh thu
------------ + ---------------
 Đường số 1 | 5
 HQ | 9
 Trung tâm thành phố | 5
(3 hàng)
 

Average ( AVG )

Tìm giá ưu đãi trung bình cho mỗi vị trí chỉ có nghĩa là hoán đổi < code> Hàm SUM () cho hàm AVG () :

  SELECT
  địa điểm,
  AVG (giá) AS average_revenue_per_sale
TỪ bán hàng
NHÓM THEO vị trí;
 

Làm việc với nhiều nhóm

Cho đến nay, chúng tôi chỉ làm việc với một nhóm: vị trí.

Điều gì sẽ xảy ra nếu chúng tôi muốn chia nhỏ nhóm đó hơn nữa?

Tương tự như kịch bản “nước sinh và màu mắt” mà chúng tôi đã bắt đầu, điều gì sẽ xảy ra nếu chúng tôi muốn tìm số lượng bán hàng < strong> per product per location?

Để làm được điều này, tất cả những gì chúng ta cần làm là thêm điều kiện phân nhóm thứ hai vào câu lệnh GROUP BY :

< pre> CHỌN ...
TỪ bán hàng
GROUP BY vị trí, sản phẩm;

Bằng cách thêm cột thứ hai vào GROUP BY , chúng tôi chia nhỏ hơn nữa các nhóm vị trí của mình thành các nhóm vị trí cho mỗi sản phẩm.

Bởi vì chúng tôi hiện cũng đang nhóm theo cột product , nên bây giờ chúng tôi có thể trả lại nó trong SELECT của chúng tôi!

(Tôi sẽ ném một số mệnh đề ORDER BY vào các truy vấn này để giúp đầu ra dễ đọc hơn.)

  SELECT
  địa điểm,
  sản phẩm
TỪ bán hàng
NHÓM THEO vị trí, sản phẩm
ĐẶT HÀNG THEO địa điểm, sản phẩm;
 

Nhìn vào kết quả của nhóm mới của chúng tôi, chúng tôi có thể thấy các kết hợp vị trí / sản phẩm duy nhất của chúng tôi:

  location | sản phẩm
------------ + ---------
 Đường số 1 | Bánh mì tròn
 Đường số 1 | Cà phê
 Trung tâm thành phố | Bánh mì tròn
 Trung tâm thành phố | Cà phê
 HQ | Bánh mì tròn
 HQ | Cà phê
(6 hàng)
 

Bây giờ chúng tôi đã có các nhóm của mình, chúng tôi muốn làm gì với phần còn lại của dữ liệu cột của mình?

Chà, chúng tôi có thể tìm thấy số lần bán hàng trên mỗi sản phẩm mỗi vị trí bằng cách sử dụng các hàm tổng hợp giống như trước đây:

  CHỌN
  địa điểm,
  sản phẩm,
  COUNT (*) AS number_of_sales
TỪ bán hàng
NHÓM THEO vị trí, sản phẩm
ĐẶT HÀNG THEO địa điểm, sản phẩm;
 
  vị trí | sản phẩm | number_of_sales
------------ + --------- + -----------------
 Đường số 1 | Bánh mì tròn | 1
 Đường số 1 | Cà phê | 1
 Trung tâm thành phố | Bánh mì tròn | 1
 Trung tâm thành phố | Cà phê | 1
 HQ | Bánh mì tròn | 2
 HQ | Cà phê | 2
(6 hàng)
 

Như một bài tập cho The Reader ™: tìm tổng doanh thu (tổng) của từng sản phẩm trên mỗi địa điểm.

Sử dụng các hàm trong GROUP BY

Tiếp theo, hãy thử tìm tổng số lần bán hàng mỗi ngày .

< p> Nếu chúng tôi tuân theo mô hình tương tự như chúng tôi đã làm với các vị trí và nhóm theo cột sell_at

  CHỌN
  bán_at,
  COUNT (*) AS sales_per_day
TỪ bán hàng
GROUP BY đã bán_at
ĐẶT HÀNG BỞI_đã bán_at;
 

… chúng tôi có thể mong đợi mỗi nhóm là mỗi ngày duy nhất — nhưng thay vào đó, chúng tôi thấy điều này:

 sell_at | sales_per_day
---------------------------- + ---------------
 2020-08-29 08: 42: 33.085995 | 1
 2020-08-29 09: 42: 33.085995 | 1
 2020-08-30 08: 42: 33.085995 | 1
 2020-08-30 09: 42: 33.085995 | 1
 2020-08-31 09: 42: 33.085995 | 1
 2020-09-01 07: 42: 33.085995 | 1
 2020-09-01 08: 42: 33.085995 | 1
 2020-09-01 09: 42: 33.085995 | 1
(8 hàng)
 

Có vẻ như dữ liệu của chúng tôi hoàn toàn không được nhóm lại — chúng tôi lấy lại từng hàng riêng lẻ.

Nhưng, dữ liệu của chúng tôi thực sự được nhóm lại! Vấn đề là sell_at của mỗi hàng là một giá trị duy nhất — vì vậy mỗi hàng đều có nhóm riêng!

GROUP BY đang hoạt động chính xác, nhưng đây là không phải là kết quả chúng tôi muốn.

Thủ phạm là thông tin giờ / phút / giây duy nhất của dấu thời gian.

Mỗi dấu thời gian này khác nhau theo giờ, phút hoặc giây — vì vậy mỗi dấu thời gian được đặt trong nhóm riêng của chúng.

Chúng ta cần chuyển đổi từng giá trị ngày và giờ này thành ngày:

  • 2020-09-01 08: 42: 33.085995 = & gt; 2020-09-01
  • 2020-09-01 09: 42: 33.085995 = & gt; 2020-09-01

Được chuyển đổi thành một ngày, tất cả các dấu thời gian trong cùng một ngày sẽ trả về cùng một giá trị ngày — và do đó sẽ được đặt vào cùng một nhóm.

Để thực hiện việc này, chúng tôi sẽ truyền giá trị dấu thời gian sell_at thành một ngày:

  LỰA CHỌN
  sell_at :: DATE AS ngày,
  COUNT (*) AS sales_per_day
TỪ bán hàng
GROUP BY sold_at :: DATE
ĐẶT HÀNG BẰNG ngày_tại :: DATE;
 

Trong mệnh đề GROUP BY của chúng tôi, chúng tôi sử dụng :: DATE để cắt bớt phần dấu thời gian xuống “ngày”. Điều này giúp loại bỏ hiệu quả giờ / phút / giây của dấu thời gian và chỉ trả về ngày.

Trong SELECT của chúng tôi, chúng tôi cũng trả về cùng một biểu thức này và đặt cho nó một bí danh cho đẹp tăng kết quả đầu ra.

Vì lý do tương tự, chúng tôi không thể trả lại product mà không nhóm theo nó hoặc thực hiện một số loại tổng hợp trên nó, cơ sở dữ liệu sẽ không cho phép chúng tôi trả về sell_at —mọi thứ trong SELECT phải nằm trong GROUP BY hoặc một số loại tổng hợp trên các nhóm kết quả.

Kết quả là doanh số bán hàng mỗi ngày mà chúng tôi muốn xem ban đầu:

  date | sales_per_day
------------ + ---------------
 2020-08-29 | 2
 2020-08-30 | 2
 2020-08-31 | 1
 2020-09-01 | 3
(4 hàng)
 

Lọc các nhóm bằng HAVING

Tiếp theo, hãy xem cách lọc các hàng được nhóm của chúng ta .

Để làm điều này, hãy cố gắng tìm những ngày mà chúng ta có nhiều lần bán hàng.

Nếu không nhóm lại, chúng ta thường lọc các hàng của mình bằng cách sử dụng WHERE mệnh đề. Ví dụ:

  CHỌN *
TỪ bán hàng
WHERE product = 'Cà phê';
 

Với các nhóm của mình, chúng tôi có thể muốn làm điều gì đó như thế này để lọc các nhóm của mình dựa trên số lượng hàng ...

  CHỌN
  sell_at :: DATE AS ngày,
  COUNT (*) AS sales_per_day
TỪ bán hàng
ĐẾM ĐẾM (*) & gt; 1 - lọc các nhóm?
GROUP BY đã bán_at :: DATE;
 

Rất tiếc, cách này không hoạt động và chúng tôi nhận được lỗi này:

LỖI: các hàm tổng hợp không được phép trong WHERE

Các hàm tổng hợp không được phép trong mệnh đề WHERE vì mệnh đề WHERE được đánh giá trước GROUP BY mệnh đề — chưa có bất kỳ nhóm nào để thực hiện tính toán.

Tuy nhiên, có một loại mệnh đề cho phép chúng tôi lọc, thực hiện tổng hợp và nó được đánh giá sau GROUP BY Mệnh đề : mệnh đề HAVING .

Mệnh đề HAVING giống như mệnh đề WHERE dành cho nhóm của bạn.

Để tìm những ngày mà chúng tôi có nhiều lần bán hàng, chúng tôi có thể thêm mệnh đề HAVING để kiểm tra số lượng hàng trong nhóm:

  CHỌN
  sell_at :: DATE AS ngày,
  COUNT (*) AS sales_per_day
TỪ bán hàng
GROUP BY sold_at :: DATE
CÓ ĐẾM (*) & gt; 1;
 

Mệnh đề HAVING này lọc ra bất kỳ hàng nào mà số lượng hàng trong nhóm đó không lớn hơn một và chúng tôi thấy rằng trong tập kết quả của chúng tôi:

  ngày | sales_per_day
------------ + ---------------
 2020-09-01 | 3
 2020-08-29 | 2
 2020-08-30 | 2
(3 hàng)
 

Chỉ vì mục đích đầy đủ, đây là thứ tự thực thi cho tất cả các phần của câu lệnh SQL:

  • FROM - Truy xuất tất cả các hàng từ bảng FROM
  • THAM GIA - Thực hiện bất kỳ phép nối nào
  • WHERE - Lọc các hàng
  • GROUP BY - Các nhóm biểu mẫu
  • HAVING - Lọc các nhóm
  • CHỌN - Chọn dữ liệu để trả về
  • ORDER BY - Sắp xếp các hàng đầu ra
  • LIMIT - Trả về một số lượng hàng nhất định
  • Tổng hợp có nhóm ngầm định

    Chủ đề cuối cùng chúng ta sẽ xem xét là các tập hợp có thể được thực hiện mà không cần mã GROUP BY —Hoặc có thể tốt hơn nên nói rằng chúng có một nhóm ngầm định.

    Những tổng hợp này hữu ích trong các trường hợp mà bạn muốn tìm một tổng hợp cụ thể từ một bảng — như tổng doanh thu hoặc giá trị lớn nhất hoặc nhỏ nhất của một cột.

    Ví dụ: chúng tôi có thể tìm tổng doanh thu trên tất cả các vị trí chỉ bằng cách chọn tổng từ toàn bộ bảng:

      SELECT SUM (giá)
    TỪ doanh số bán hàng;
     
      sum
    -----
      19
    (1 hàng)
     < / p> 

    Ví dụ: ngày bán hàng đầu tiên của chúng tôi là ngày nào?

    Để tìm cái này, chúng ta chỉ cần sử dụng hàm MIN () :

      SELECT MIN (sell_at) :: DATE AS first_sale
    TỪ doanh số bán hàng;
     
      first_sale
    ------------
     2020-08-29
    (1 hàng)
     

    (Để tìm ngày bán hàng cuối cùng, chỉ cần thay thế MAX () cho MIN () .)

    < h3 id = "using-min-max"> Sử dụng MIN / MAX

    Mặc dù những truy vấn đơn giản này có thể hữu ích như một truy vấn độc lập, nhưng chúng ' thường là các phần của bộ lọc cho các truy vấn lớn hơn.

    Ví dụ: hãy thử tìm tổng doanh số cho ngày cuối cùng mà chúng tôi có doanh số bán hàng.

    Một cách chúng tôi có thể viết truy vấn đó sẽ giống như sau:

      CHỌN
      SUM (giá)
    TỪ bán hàng
    WHERE sold_at :: DATE = '2020-09-01';
     

    Truy vấn này hoạt động, nhưng rõ ràng là chúng tôi đã mã hóa cứng ngày 2020-09-01 .

    09/01/2020 có thể là ngày cuối cùng chúng tôi bán hàng, nhưng không phải lúc nào cũng sẽ là ngày đó. Chúng tôi cần một giải pháp động.

    Có thể đạt được điều này bằng cách kết hợp truy vấn này với hàm MAX () trong một truy vấn con:

      CHỌN
      SUM (giá)
    TỪ bán hàng
    WHERE sold_at :: DATE = (
      CHỌN TỐI ĐA (sell_at :: DATE)
      TỪ bán hàng
    );
     

    Trong mệnh đề WHERE , chúng tôi tìm ngày lớn nhất trong bảng bằng cách sử dụng truy vấn con: SELECT MAX (sell_at :: DATE) FROM sales .

    Sau đó, chúng tôi sử dụng ngày tối đa này làm giá trị mà chúng tôi lọc trên bảng và tính tổng giá của mỗi lần giảm giá.

    Phân nhóm ngầm

    Tôi nói rằng đây là các nhóm ngầm định bởi vì nếu chúng tôi cố gắng chọn một giá trị tổng hợp với một cột không được tổng hợp như thế này ...

      CHỌN
      SUM (giá),
      địa điểm
    TỪ doanh số bán hàng;
     

    ... chúng tôi gặp lỗi quen thuộc:

      LỖI: cột "sales.location" phải xuất hiện trong mệnh đề GROUP BY hoặc được sử dụng trong chức năng tổng hợp
     

    GROUP BY là một công cụ

    Cũng như nhiều chủ đề khác trong phần mềm phát triển, GROUP BY là một công cụ.

    Có nhiều cách để viết và viết lại các truy vấn này bằng cách sử dụng kết hợp GROUP BY , các hàm tổng hợp, hoặc các công cụ khác như DISTINCT , ORDER BY LIMIT .

    Hiểu và làm việc với GROUP BY < / code> sẽ cần một chút thực hành, nhưng khi bạn đã hiểu nó, bạn sẽ thấy một loạt các vấn đề hoàn toàn mới giờ đây có thể giải quyết được cho bạn!

    Nếu bạn thích bài đăng này, bạn có thể theo dõi tôi trên twitter , nơi tôi nói về những điều cơ sở dữ liệu và cách thành công trong sự nghiệp của một nhà phát triển.

    Cảm ơn vì đã đọc!

    John


Xem thêm những thông tin liên quan đến chủ đề tổng sql và nhóm theo

GROUPING ID function in SQL Server

  • Tác giả: kudvenkat
  • Ngày đăng: 2015-09-27
  • Đánh giá: 4 ⭐ ( 6981 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: grouping_id function in sql server 2008
    grouping_id in sql server 2008 example
    sql server grouping level

    In this video we will discuss
    1. GROUPING_ID function in SQL Server
    2. Difference between GROUPING and GROUPING_ID functions
    3. Use of GROUPING_ID function

    Healthy diet is very important both for the body and mind. If you like Aarvi Kitchen recipes, please support by sharing, subscribing and liking our YouTube channel. Hope you can help.
    https://www.youtube.com/channel/UC7sEwIXM_YfAMyonQCrGfWA/?sub_confirmation=1

    GROUPING_ID function computes the level of grouping.

    Difference between GROUPING and GROUPING_ID

    Syntax : GROUPING function is used on single column, where as the column list for GROUPING_ID function must match with GROUP BY column list.

    GROUPING(Col1)

    GROUPING_ID(Col1, Col2, Col3,...)

    GROUPING indicates whether the column in a GROUP BY list is aggregated or not. Grouping returns 1 for aggregated or 0 for not aggregated in the result set.

    GROUPING_ID() function concatenates all the GOUPING() functions, perform the binary to decimal conversion, and returns the equivalent integer. In short
    GROUPING_ID (A, B, C) = GROUPING(A) + GROUPING(B) + GROUPING(C)

    Let us understand this with an example.

    SELECT Continent, Country, City, SUM(SaleAmount) AS TotalSales,
    CAST(GROUPING(Continent) AS NVARCHAR(1)) +
    CAST(GROUPING(Country) AS NVARCHAR(1)) +
    CAST(GROUPING(City) AS NVARCHAR(1)) AS Groupings,
    GROUPING_ID(Continent, Country, City) AS GPID
    FROM Sales
    GROUP BY ROLLUP(Continent, Country, City)

    Row Number 1 : Since the data is not aggregated by any column GROUPING(Continent), GROUPING(Country) and GROUPING(City) return 0 and as result we get a binar string with all ZEROS (000). When this converted to decimal we get 0 which is displayed in GPID column.

    Row Number 7 : The data is aggregated for Country and City columns, so GROUPING(Country) and GROUPING(City) return 1 where as GROUPING(Continent) return 0. As result we get a binar string (011). When this converted to decimal we get 10 which is displayed in GPID column.

    Row Number 15 : This is the Grand total row. Notice in this row the data is aggregated by all the 3 columns. Hence all the 3 GROUPING functions return 1. So we get a binary string with all ONES (111). When this converted to decimal we get 7 which is displayed in GPID column.

    Use of GROUPING_ID function : GROUPING_ID function is very handy if you want to sort and filter by level of grouping.

    Sorting by level of grouping :

    SELECT Continent, Country, City, SUM(SaleAmount) AS TotalSales,
    GROUPING_ID(Continent, Country, City) AS GPID
    FROM Sales
    GROUP BY ROLLUP(Continent, Country, City)
    ORDER BY GPID

    Filter by level of grouping : The following query retrieves only continent level aggregated data
    SELECT Continent, Country, City, SUM(SaleAmount) AS TotalSales,
    GROUPING_ID(Continent, Country, City) AS GPID
    FROM Sales
    GROUP BY ROLLUP(Continent, Country, City)
    HAVING GROUPING_ID(Continent, Country, City) = 3

    Text version of the video
    http://csharp-video-tutorials.blogspot.com/2015/09/groupingid-function-in-sql-server.html

    Slides
    http://csharp-video-tutorials.blogspot.com/2015/09/groupingid-function-in-sql-server_27.html

    All SQL Server Text Articles
    http://csharp-video-tutorials.blogspot.com/p/free-sql-server-video-tutorials-for.html

    All SQL Server Slides
    http://csharp-video-tutorials.blogspot.com/p/sql-server.html

    All Dot Net and SQL Server Tutorials in English
    https://www.youtube.com/user/kudvenkat/playlists?view=1&sort=dd

    All Dot Net and SQL Server Tutorials in Arabic
    https://www.youtube.com/c/KudvenkatArabic/playlists

Tài liệu học SQL: Sự khác biệt giữa Window Functions và GROUP BY

  • Tác giả: datapot.vn
  • Đánh giá: 3 ⭐ ( 9312 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Window Functions và GROUP BY là hai khái niệm dễ gây nhầm lẫn trong SQL. Tuy nhiên, hai khái niệm này có nhiều điểm khác biệt rõ rệt.

Cách chọn, tính tổng và hàng trung bình trong SQL

  • Tác giả: final-blade.com
  • Đánh giá: 3 ⭐ ( 6891 lượt đánh giá )
  • Khớp với kết quả tìm kiếm:

Nhóm theo SQL

  • Tác giả: vi.tutorialcup.com
  • Đánh giá: 3 ⭐ ( 1309 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Nhóm theo SQL

Gom nhóm dữ liệu với GROUP BY trong SQL

  • Tác giả: shareprogramming.net
  • Đánh giá: 3 ⭐ ( 5524 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Tức là nếu một cột cụ thể của các dòng khác nhau có giá trị giống nhau thì chúng sẽ được sắp xếp thành một nhóm.

SQL Server: Các lệnh Group By trong SQL Server có thể bạn chưa biết

  • Tác giả: comdy.vn
  • Đánh giá: 4 ⭐ ( 2071 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Trong hướng dẫn này, bạn sẽ tìm hiểu mệnh đề GROUP BY, GROUPING SET, CUBE, ROLLUP và HAVING trong SQL Server để sắp xếp các bản ghi theo nhóm.

sự khác biệt giữa GROUP BY và ORDER BY trong sql

  • Tác giả: qastack.vn
  • Đánh giá: 4 ⭐ ( 1437 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: [Tìm thấy giải pháp!] ORDER BY thay đổi thứ tự các mặt hàng được trả lại. GROUP BY sẽ tổng…

Xem thêm các bài viết khác thuộc chuyên mục: Kiến thức lập trình

Xem Thêm  Cách thêm JavaScript vào html - bao gồm javascript trong html

By ads_php