Trong các truy vấn SQL, chúng tôi sử dụng nhóm theo mệnh đề để áp dụng các hàm tổng hợp.
- Nhưng mục đích đằng sau việc sử dụng giá trị số thay vì tên cột với mệnh đề Nhóm là gì? Ví dụ: Nhóm theo 1.
Trong các truy vấn SQL, chúng tôi sử dụng nhóm theo mệnh đề để áp dụng các hàm tổng hợp.
Câu trả lời:
Đây thực sự là một điều tồi tệ khi làm IMHO và nó không được hỗ trợ trong hầu hết các nền tảng cơ sở dữ liệu khác.
Những lý do mọi người làm điều đó:
Những lý do nó xấu:
đó không phải là tài liệu tự luận - ai đó sẽ phải phân tích danh sách CHỌN để tìm ra nhóm. Nó thực sự sẽ rõ ràng hơn một chút trong SQL Server, nó không hỗ trợ nhóm cao bồi, những người biết điều gì sẽ xảy ra như nhóm.
nó dễ vỡ - ai đó đến và thay đổi danh sách CHỌN vì người dùng doanh nghiệp muốn có đầu ra báo cáo khác và hiện tại đầu ra của bạn là một mớ hỗn độn. Nếu bạn đã sử dụng tên cột trong NHÓM THEO, thứ tự trong danh sách CHỌN sẽ không liên quan.
SQL Server hỗ trợ ĐẶT HÀNG B [NG [thứ tự]; Dưới đây là một số đối số song song chống lại việc sử dụng nó:
MySQL cho phép bạn thực hiện GROUP BY
với các bí danh ( Các vấn đề với Bí danh Cột ). Điều này sẽ tốt hơn nhiều khi làm GROUP BY
với số.
column number
trong sơ đồ SQL . Một dòng cho biết: Sắp xếp kết quả theo số cột đã cho hoặc theo biểu thức. Nếu biểu thức là một tham số đơn, thì giá trị được hiểu là số cột. Số cột âm đảo ngược thứ tự sắp xếp.Google có nhiều ví dụ về việc sử dụng nó và tại sao nhiều người đã ngừng sử dụng nó.
Thành thật với bạn, tôi đã không sử dụng số cột trong ORDER BY
và GROUP BY
từ năm 1996 (lúc đó tôi đang thực hiện Phát triển PL / SQL của Oracle). Việc sử dụng số cột thực sự dành cho các bộ định thời cũ và khả năng tương thích ngược cho phép các nhà phát triển như vậy sử dụng MySQL và các RDBMS khác vẫn cho phép.
Xem xét trường hợp dưới đây:
+------------+--------------+-----------+
| date | services | downloads |
+------------+--------------+-----------+
| 2016-05-31 | Apps | 1 |
| 2016-05-31 | Applications | 1 |
| 2016-05-31 | Applications | 1 |
| 2016-05-31 | Apps | 1 |
| 2016-05-31 | Videos | 1 |
| 2016-05-31 | Videos | 1 |
| 2016-06-01 | Apps | 3 |
| 2016-06-01 | Applications | 4 |
| 2016-06-01 | Videos | 2 |
| 2016-06-01 | Apps | 2 |
+------------+--------------+-----------+
Bạn đã tìm ra số lượt tải xuống mỗi dịch vụ mỗi ngày, coi Ứng dụng và Ứng dụng là cùng một dịch vụ. Nhóm theo date, services
sẽ dẫn đến Apps
và Applications
được coi là dịch vụ riêng biệt.
Trong trường hợp đó, truy vấn sẽ là:
select date, services, sum(downloads) as downloads
from test.zvijay_test
group by date,services
Và đầu ra:
+------------+--------------+-----------+
| date | services | downloads |
+------------+--------------+-----------+
| 2016-05-31 | Applications | 2 |
| 2016-05-31 | Apps | 2 |
| 2016-05-31 | Videos | 2 |
| 2016-06-01 | Applications | 4 |
| 2016-06-01 | Apps | 5 |
| 2016-06-01 | Videos | 2 |
+------------+--------------+-----------+
Nhưng đây không phải là điều bạn muốn vì Ứng dụng và Ứng dụng được nhóm lại là yêu cầu. Vậy chúng ta có thể làm gì?
Một cách là thay thế Apps
bằng Applications
cách sử dụng một CASE
biểu thức hoặc IF
hàm và sau đó nhóm chúng qua các dịch vụ như:
select
date,
if(services='Apps','Applications',services) as services,
sum(downloads) as downloads
from test.zvijay_test
group by date,services
Nhưng điều này vẫn nhóm các dịch vụ xem xét Apps
và Applications
như các dịch vụ khác nhau và cho cùng một đầu ra như trước đây:
+------------+--------------+-----------+
| date | services | downloads |
+------------+--------------+-----------+
| 2016-05-31 | Applications | 2 |
| 2016-05-31 | Applications | 2 |
| 2016-05-31 | Videos | 2 |
| 2016-06-01 | Applications | 4 |
| 2016-06-01 | Applications | 5 |
| 2016-06-01 | Videos | 2 |
+------------+--------------+-----------+
Nhóm trên một số cột cho phép bạn nhóm dữ liệu trên một cột bí danh.
select
date,
if(services='Apps','Applications',services) as services,
sum(downloads) as downloads
from test.zvijay_test
group by date,2;
Và do đó cung cấp cho bạn đầu ra mong muốn như dưới đây:
+------------+--------------+-----------+
| date | services | downloads |
+------------+--------------+-----------+
| 2016-05-31 | Applications | 4 |
| 2016-05-31 | Videos | 2 |
| 2016-06-01 | Applications | 9 |
| 2016-06-01 | Videos | 2 |
+------------+--------------+-----------+
Tôi đã đọc nhiều lần rằng đây là một cách lười biếng để viết các truy vấn hoặc nhóm trên một cột bí danh không hoạt động trong MySQL, nhưng đây là cách nhóm các cột bí danh.
Đây không phải là cách viết truy vấn ưa thích, chỉ sử dụng nó khi bạn thực sự cần nhóm trên một cột bí danh.
Không có lý do hợp lệ để sử dụng nó. Nó chỉ đơn giản là một phím tắt lười biếng được thiết kế đặc biệt để gây khó khăn cho một số nhà phát triển khó tính trong việc tìm ra nhóm của bạn hoặc sắp xếp sau này hoặc cho phép mã bị lỗi một cách thảm hại khi ai đó thay đổi thứ tự cột. Hãy quan tâm đến các nhà phát triển đồng nghiệp của bạn và đừng làm điều đó.
Điều này được làm việc cho tôi. Mã nhóm các hàng lên đến 5 nhóm.
SELECT
USR.UID,
USR.PROFILENAME,
(
CASE
WHEN MOD(@curRow, 5) = 0 AND @curRow > 0 THEN
@curRow := 0
ELSE
@curRow := @curRow + 1
/*@curRow := 1*/ /*AND @curCode := USR.UID*/
END
) AS sort_by_total
FROM
SS_USR_USERS USR,
(
SELECT
@curRow := 0,
@curCode := ''
) rt
ORDER BY
USR.PROFILENAME,
USR.UID
Kết quả sẽ như sau
SELECT dep_month,dep_day_of_week,dep_date,COUNT(*) AS flight_count FROM flights GROUP BY 1,2;
SELECT dep_month,dep_day_of_week,dep_date,COUNT(*) AS flight_count FROM flights GROUP BY 1,2,3;
Xem xét các truy vấn trên: Nhóm theo 1 có nghĩa là nhóm theo cột đầu tiên và nhóm theo 1,2 có nghĩa là nhóm theo cột thứ nhất và thứ hai và nhóm theo 1,2,3 có nghĩa là nhóm theo cột thứ hai và thứ ba. Ví dụ:
hình ảnh này cho thấy hai cột đầu tiên được nhóm theo 1,2 tức là nó không xem xét các giá trị khác nhau của dep_date để tìm số đếm (để tính tất cả các kết hợp khác nhau của hai cột đầu tiên được xem xét) trong khi truy vấn thứ hai cho kết quả này
hình ảnh. Ở đây, nó đang xem xét tất cả ba cột đầu tiên và có các giá trị khác nhau để tìm số đếm tức là, nó được nhóm theo tất cả ba cột đầu tiên (để tính tất cả các kết hợp khác nhau của ba cột đầu tiên được xem xét).
order by 1
Chỉ sử dụng khi ngồi tạimysql>
dấu nhắc. Trong mã, sử dụngORDER BY id ASC
. Lưu ý trường hợp, tên trường rõ ràng và hướng đặt hàng rõ ràng.