CFSDN nhấn mạnh vào giá trị tạo ra nguồn mở và chúng tôi cam kết xây dựng nền tảng chia sẻ tài nguyên để mọi nhân viên CNTT có thể tìm thấy thế giới tuyệt vời của bạn tại đây.
Bài blog CFSDN này sử dụng GROUPING, ROLLUP và CUBE để tóm tắt hàm trong SQL Server. Nếu các bạn quan tâm đến bài viết này thì nhớ like nhé.
Đây là lần đầu tiên tôi nhìn thấy một câu lệnh SQL như vậy và tôi không thể hiểu được nó.
Chức năng tổng hợp: GROUPING.
Toán tử dùng để tóm tắt dữ liệu: ROLLUP.
LỰA CHỌN
NHÓM TRƯỜNG HỢP (o.customerid) KHI 0 THÌ o.customerid KHÁC '(Tổng)' KẾT THÚC
AS AllCustomersSummary,
NHÓM TRƯỜNG HỢP (od.orderid) KHI 0 THÌ od.orderid KHÁC -1 KẾT THÚC
AS Cá nhânKhách hàngTóm tắt,
SUM(od.quantity*od.unitprice) AS giá
TỪ Đơn hàng o, [Chi tiết đơn hàng] od
NƠI Năm (o.orderdate) = 1998 VÀ od.orderid=o.orderid
NHÓM THEO o.customerid, od.orderid VỚI ROLLUP
ĐẶT HÀNG BỞI AllCustomersSummary
Sau khi kiểm tra sự trợ giúp của SQL Server, tôi phát hiện ra rằng nó thật tuyệt vời. Hóa ra có một thứ mạnh mẽ như vậy. Tôi không thể không nghĩ đến thời điểm tôi làm Crystal Reports. có thể được thực hiện trong SQL Server.
1. Sử dụng CUBE để tóm tắt dữ liệu
Tập kết quả do toán tử CUBE tạo ra là một khối lập phương. Khối là phần mở rộng của dữ liệu thực tế, là dữ liệu ghi lại các sự kiện riêng lẻ. Tiện ích mở rộng được xây dựng trên các cột mà người dùng dự định phân tích. Các cột này được gọi là kích thước. Khối là một tập kết quả chứa một bảng chéo của tất cả các kết hợp thứ nguyên có thể có.
Toán tử CUBE được chỉ định trong mệnh đề GROUP BY của câu lệnh SELECT. Danh sách lựa chọn của câu lệnh phải chứa các cột thứ nguyên và các biểu thức hàm tổng hợp. GROUP BY nên chỉ định các cột thứ nguyên và từ khóa VỚI CUBE. Tập kết quả sẽ chứa tất cả các kết hợp giá trị có thể có trong các cột thứ nguyên và các giá trị tổng hợp trong các hàng cơ bản khớp với các kết hợp giá trị thứ nguyên này.
Ví dụ: một bảng đơn giản Khoảng không quảng cáo chứa:
。
Màu sắc sản phẩm Số lượng -------------------- -------------------- -------------------------- Bàn màu xanh 124 Bàn màu đỏ 223 Ghế màu xanh 101 Ghế màu đỏ 210
Truy vấn sau đây trả về một tập kết quả sẽ chứa tổng phụ Số lượng cho tất cả các kết hợp Mục và Màu có thể có:
。
CHỌN Mục, Màu sắc, TỔNG (Số lượng) NHƯ QtySumFROM InventoryGROUP BY Mục, Màu sắc VỚI CUBE
Đây là tập kết quả:
。
Màu sắc mặt hàng Số lượng Tổng -------------------- -------------------- -------------------------- Ghế Xanh 101,00 Ghế Đỏ 210,00 Ghế (null) 311,00 Bàn Xanh 124,00 Bàn Đỏ 223,00 Bàn (null) 347,00 (null) (null) 658,00 (null) Xanh 225,00 (null) Đỏ 433,00
Chúng tôi tập trung vào các dòng sau:
。
Ghế (null) 311.00
Hàng này báo cáo tổng phụ cho tất cả các hàng trong thứ nguyên Mục có giá trị là Ghế. Giá trị NULL được trả về cho thứ nguyên Màu sắc, biểu thị rằng tổng hợp được báo cáo bởi hàng này bao gồm các hàng có bất kỳ giá trị nào cho thứ nguyên Màu sắc.
。
Bảng (null) 347.00
Hàng này tương tự nhưng báo cáo tổng phụ cho tất cả các hàng trong thứ nguyên Mục có giá trị là Bảng.
。
(không) (không) 658.00
Hàng này báo cáo tổng số của khối. Giá trị của cả thứ nguyên Mục và Màu sắc đều là NULL, biểu thị rằng tất cả giá trị trong cả hai thứ nguyên đều được tóm tắt trong hàng này.
。
(null) Xanh lam 225,00 (null) Đỏ 433,00
Hai hàng này báo cáo tổng phụ của thứ nguyên Màu sắc. Giá trị thứ nguyên Mục ở cả hai hàng đều là NULL, biểu thị rằng dữ liệu tổng hợp đến từ các hàng có bất kỳ giá trị nào trong thứ nguyên Mục.
Sử dụng GROUPING để phân biệt giá trị null
Giá trị NULL được tạo ra bởi thao tác CUBE dẫn đến một vấn đề: Làm cách nào để phân biệt giá trị NULL được tạo ra bởi thao tác CUBE và giá trị NULL được trả về từ dữ liệu thực tế? Vấn đề này có thể được giải quyết bằng chức năng GROUPING. Hàm GROUPING trả về 0 nếu giá trị trong cột xuất phát từ dữ liệu thực tế và 1 nếu giá trị trong cột là NULL do thao tác CUBE. Trong hoạt động CUBE, NULL được tạo đại diện cho toàn bộ giá trị. Câu lệnh SELECT có thể được viết để sử dụng hàm GROUPING nhằm thay thế NULL kết quả bằng chuỗi ALL. Vì dữ liệu thực tế NULL chỉ ra rằng giá trị dữ liệu không xác định nên câu lệnh SELECT cũng có thể được giải mã để trả về chuỗi UNKNOWN thay cho NULL từ dữ liệu thực tế. Ví dụ:
。
CHỌN TRƯỜNG HỢP KHI (NHÓM(Mục) = 1) THÌ 'TẤT CẢ' KHÁC LÀ KHÔNG (Mục, 'KHÔNG BIẾT') KẾT THÚC DƯỚI DẠNG Mục, TRƯỜNG HỢP KHI (NHÓM(Màu) = 1) THÌ 'TẤT CẢ' KHÁC LÀ KHÔNG BIẾT') KẾT THÚC DƯỚI DẠNG Màu, TỔNG(Số lượng) DƯỚI DẠNG SỐ LƯỢNG TỪ HÀNG TỒN KHO NHÓM THEO Mục, Màu VỚI KHỐI
khối lập phương
Toán tử CUBE có thể được sử dụng để tạo các khối n chiều, nghĩa là các khối có số chiều bất kỳ. Các khối chỉ có một chiều có thể được sử dụng để tạo tổng, ví dụ:
。
CHỌN TRƯỜNG HỢP KHI (NHÓM(Mục) = 1) THÌ 'TẤT CẢ' KHÁC LÀ NULL(Mục, 'KHÔNG BIẾT') KẾT THÚC NHƯ Mục, TỔNG(Số lượng) NHÓM(Số lượng) NHÓM THEO Mục VỚI CUBEGO
Câu lệnh SELECT này trả về một tập kết quả hiển thị cả tổng phụ cho từng giá trị trong Item và tổng cho tất cả các giá trị trong Item:
。
Mặt hàng Số lượng Tổng -------------------- -------------------------- Ghế 311,00 Bàn 347,00 TẤT CẢ 658,00
Câu lệnh SELECT chứa CUBE có nhiều thứ nguyên có thể tạo ra các tập kết quả lớn vì chúng tạo ra các hàng cho tất cả các kết hợp giá trị trong tất cả các thứ nguyên. Những tập hợp kết quả lớn này có thể chứa quá nhiều dữ liệu để có thể dễ dàng đọc và hiểu. Một giải pháp cho vấn đề này là đặt câu lệnh SELECT trong khung nhìn:
。
TẠO VIEW InvCube ASSELECT CASE WHEN (GROUPING(Item) = 1) THEN 'ALL' ELSE ISNULL(Item, 'UNKNOWN') END AS Item, CASE WHEN (GROUPING(Color) = 1) THEN 'ALL' ELSE ISNULL(Color, 'UNKNOWN') END AS Color, SUM(Quantity) AS QtySumFROM InventoryGROUP BY Item, Color WITH CUBE
Sau đó, bạn có thể sử dụng chế độ xem này để chỉ truy vấn các giá trị thứ nguyên mà bạn quan tâm:
。
CHỌN *TỪ InvCubeWHERE Mục = 'Ghế' VÀ Màu = 'TẤT CẢ'Màu mục Số lượng Tổng -------------------- -------------------- -------------------------- Ghế TẤT CẢ 311,00 (1 hàng bị ảnh hưởng)
。
2. Sử dụng ROLLUP để tóm tắt dữ liệu
Toán tử ROLLUP rất hữu ích khi tạo báo cáo chứa tổng phụ và tổng. Toán tử ROLLUP tạo ra tập kết quả tương tự như tập kết quả do toán tử CUBE tạo ra. Để biết thêm thông tin.
Sự khác biệt giữa CUBE và ROLLUP là:
Ví dụ: bảng đơn giản Hàng tồn kho chứa:
。
Màu sắc sản phẩm Số lượng -------------------- -------------------- -------------------------- Bàn màu xanh 124 Bàn màu đỏ 223 Ghế màu xanh 101 Ghế màu đỏ 210
Truy vấn sau đây sẽ tạo ra một báo cáo tổng phụ:
。
CHỌN TRƯỜNG HỢP KHI (GROUPING(Mục) = 1) THÌ 'TẤT CẢ' KHÁC LÀ KHÔNG (Mục, 'KHÔNG BIẾT') KẾT THÚC DƯỚI DẠNG Mục, TRƯỜNG HỢP KHI (GROUPING(Màu) = 1) THÌ 'TẤT CẢ' KHÁC LÀ KHÔNG BIẾT') KẾT THÚC DƯỚI DẠNG Màu, TỔNG(Số lượng) LÀ SỐ LƯỢNG TỪ KHOẢN LÝ NHÓM THEO Mục, Màu VỚI ROLLUP Màu Mục Số lượng Tổng -------------------- -------------------- -------------------------- Ghế Xanh 101,00 Ghế Đỏ 210,00 Ghế TẤT CẢ 311,00 Bàn Xanh 124,00 Bàn Đỏ 223,00 Bàn TẤT CẢ 347,00 TẤT CẢ TẤT CẢ 658,00 (7 hàng bị ảnh hưởng)
Nếu từ khóa ROLLUP trong truy vấn được thay đổi thành CUBE thì tập kết quả CUBE giống như trên ngoại trừ hai hàng sau được trả về ở cuối tập kết quả:
。
TẤT CẢ màu xanh 225,00 TẤT CẢ màu đỏ 433,00
Hoạt động CUBE tạo ra các hàng để có thể kết hợp các giá trị trong Mục và Màu sắc. Ví dụ: CUBE không chỉ báo cáo tất cả các kết hợp có thể có của các giá trị Màu được kết hợp với Giá trị Vật phẩm Ghế (Đỏ, Xanh lam và Đỏ + Xanh lam), mà còn báo cáo tất cả các kết hợp có thể có của các giá trị Vật phẩm được kết hợp với giá trị Màu Đỏ ( Ghế, Bàn và Ghế + Bàn).
Đối với mỗi giá trị ở cột bên phải trong mệnh đề GROUP BY, thao tác ROLLUP không báo cáo tất cả các kết hợp giá trị có thể có ở cột bên trái (hoặc cột bên trái). Ví dụ: ROLLUP không báo cáo mọi kết hợp có thể có của các giá trị Mục cho mọi giá trị Màu.
Tập kết quả của thao tác ROLLUP có chức năng tương tự như chức năng được COMPUTE BY trả về, tuy nhiên, ROLLUP có những ưu điểm sau:
-
ROLLUP trả về một tập kết quả duy nhất; COMPUTE BY trả về nhiều tập kết quả và nhiều tập kết quả sẽ làm tăng độ phức tạp của mã ứng dụng.
-
ROLLUP có thể được sử dụng trong con trỏ máy chủ; COMPUTE BY không thể.
-
Đôi khi trình tối ưu hóa truy vấn tạo ra một kế hoạch thực hiện ROLLUP hiệu quả hơn so với COMPUTE BY.
。
。
3.NHÓM
Là hàm tổng hợp tạo ra một cột bổ sung. Khi các hàng được thêm bằng toán tử CUBE hoặc ROLLUP, giá trị đầu ra của cột bổ sung là 1. Khi hàng được thêm không được CUBE hoặc ROLLUP tạo ra thì giá trị cột bổ sung là 0.
Việc nhóm chỉ được phép trong các danh sách chọn lọc được liên kết với mệnh đề GROUP BY có chứa toán tử CUBE hoặc ROLLUP.
ngữ pháp
NHÓM ( tên_cột ) 。
tham số
tên_cột 。
Cột được sử dụng trong mệnh đề GROUP BY để kiểm tra các giá trị null CUBE hoặc ROLLUP.
Kiểu trả về
số nguyên 。
Bình luận
Việc nhóm được sử dụng để phân biệt các giá trị null được CUBE và ROLLUP trả về với các giá trị null tiêu chuẩn. NULL được trả về do hoạt động CUBE hoặc ROLLUP là một ứng dụng đặc biệt của NULL. Nó đóng vai trò giữ chỗ cho một cột trong tập kết quả, nghĩa là "tất cả".
Ví dụ
Ví dụ sau nhóm các giá trị cho tiền bản quyền và tổng hợp các giá trị cho khoản ứng trước. Hàm GROUPING được áp dụng cho cột tiền bản quyền.
。
SỬ DỤNG pubsSELECT tiền bản quyền, SUM(tiền ứng trước) 'tổng số tiền ứng trước', GROUPING(tiền bản quyền) 'grp'
TỪ tiêu đề NHÓM THEO tiền bản quyền VỚI ROLLUP
Tập kết quả hiển thị hai giá trị null theo tiền bản quyền. NULL đầu tiên đại diện cho nhóm giá trị null thu được từ cột này trong bảng. NULL thứ hai nằm trong hàng tóm tắt được thêm vào bởi thao tác ROLLUP. Hàng tóm tắt hiển thị tổng giá trị tạm ứng cho tất cả các nhóm tiền bản quyền và được xác định bằng số 1 trong cột grp.
Đây là tập kết quả:
。
tiền bản quyền tổng số tạm ứng grp --------- --------------------- ---NULL NULL 0 10 57000.0000 0 12 2275.0000 0 14 4000.0000 0 16 7000.0000 0 24 25125.0000 0 NULL 95400.0000 1
。
。
3.NHÓM
Là hàm tổng hợp tạo ra một cột bổ sung. Khi các hàng được thêm bằng toán tử CUBE hoặc ROLLUP, giá trị đầu ra của cột bổ sung là 1. Khi hàng được thêm không được CUBE hoặc ROLLUP tạo ra thì giá trị cột bổ sung là 0.
Việc nhóm chỉ được phép trong các danh sách chọn lọc được liên kết với mệnh đề GROUP BY có chứa toán tử CUBE hoặc ROLLUP.
ngữ pháp
NHÓM ( tên_cột ) 。
tham số
tên_cột 。
Cột được sử dụng trong mệnh đề GROUP BY để kiểm tra các giá trị null CUBE hoặc ROLLUP.
Kiểu trả về
số nguyên 。
Bình luận
Việc nhóm được sử dụng để phân biệt các giá trị null được CUBE và ROLLUP trả về với các giá trị null tiêu chuẩn. NULL được trả về do hoạt động CUBE hoặc ROLLUP là một ứng dụng đặc biệt của NULL. Nó đóng vai trò giữ chỗ cho một cột trong tập kết quả, nghĩa là "tất cả".
Ví dụ
Ví dụ sau nhóm các giá trị cho tiền bản quyền và tổng hợp các giá trị cho khoản ứng trước. Hàm GROUPING được áp dụng cho cột tiền bản quyền.
。
SỬ DỤNG pubsSELECT tiền bản quyền, SUM(tiền ứng trước) 'tổng số tiền ứng trước', GROUPING(tiền bản quyền) 'grp'
TỪ tiêu đề NHÓM THEO tiền bản quyền VỚI ROLLUP
Tập kết quả hiển thị hai giá trị null theo tiền bản quyền. NULL đầu tiên đại diện cho nhóm giá trị null thu được từ cột này trong bảng. NULL thứ hai nằm trong hàng tóm tắt được thêm vào bởi thao tác ROLLUP. Hàng tóm tắt hiển thị tổng giá trị tạm ứng cho tất cả các nhóm tiền bản quyền và được xác định bằng số 1 trong cột grp.
Đây là tập kết quả:
。
tiền bản quyền tổng số tạm ứng grp --------- --------------------- ---NULL NULL 0 10 57000.0000 0 12 2275.0000 0 14 4000.0000 0 16 7000.0000 0 24 25125.0000 0 NULL 95400.0000 1
。
。
3.NHÓM
Là hàm tổng hợp tạo ra một cột bổ sung. Khi các hàng được thêm bằng toán tử CUBE hoặc ROLLUP, giá trị đầu ra của cột bổ sung là 1. Khi hàng được thêm không được CUBE hoặc ROLLUP tạo ra thì giá trị cột bổ sung là 0.
Việc nhóm chỉ được phép trong các danh sách chọn lọc được liên kết với mệnh đề GROUP BY có chứa toán tử CUBE hoặc ROLLUP.
ngữ pháp
NHÓM ( tên_cột ) 。
tham số
tên_cột 。
Cột được sử dụng trong mệnh đề GROUP BY để kiểm tra các giá trị null CUBE hoặc ROLLUP.
Kiểu trả về
số nguyên 。
Bình luận
Việc nhóm được sử dụng để phân biệt các giá trị null được CUBE và ROLLUP trả về với các giá trị null tiêu chuẩn. NULL được trả về do hoạt động CUBE hoặc ROLLUP là một ứng dụng đặc biệt của NULL. Nó đóng vai trò giữ chỗ cho một cột trong tập kết quả, nghĩa là "tất cả".
Ví dụ
Ví dụ sau nhóm các giá trị cho tiền bản quyền và tổng hợp các giá trị cho khoản ứng trước. Hàm GROUPING được áp dụng cho cột tiền bản quyền.
。
SỬ DỤNG pubsSELECT tiền bản quyền, SUM(tiền ứng trước) 'tổng số tiền ứng trước', GROUPING(tiền bản quyền) 'grp'
TỪ tiêu đề NHÓM THEO tiền bản quyền VỚI ROLLUP
Tập kết quả hiển thị hai giá trị null theo tiền bản quyền. NULL đầu tiên đại diện cho nhóm giá trị null thu được từ cột này trong bảng. NULL thứ hai nằm trong hàng tóm tắt được thêm vào bởi thao tác ROLLUP. Hàng tóm tắt hiển thị tổng giá trị tạm ứng cho tất cả các nhóm tiền bản quyền và được xác định bằng số 1 trong cột grp.
Đây là tập kết quả:
。
tiền bản quyền tổng số tạm ứng grp --------- --------------------- ---NULL NULL 0 10 57000.0000 0 12 2275.0000 0 14 4000.0000 0 16 7000.0000 0 24 25125.0000 0 NULL 95400.0000 1
Phần giới thiệu về GROUPING, ROLLUP và CUBE xuất phát từ sự trợ giúp của phiên bản SQL Server 2000 tiếng Trung.
Cuối cùng, bài viết này về cách sử dụng GROUPING, ROLLUP và CUBE cho hàm tóm tắt trong SQL Server kết thúc tại đây. Nếu bạn muốn biết thêm về cách sử dụng GROUPING, ROLLUP và CUBE cho hàm tóm tắt trong SQL Server, vui lòng tìm kiếm CFSDN. bài viết hoặc tiếp tục Duyệt các bài viết liên quan, tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .
Tôi là một lập trình viên xuất sắc, rất giỏi!