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

Mệnh đề SQL OVER () - khi nào và tại sao nó hữu ích?

Bạn có thể sử dụng GROUP BY SalesOrderID . Sự khác biệt là, với GROUP BY, bạn chỉ có thể có các giá trị tổng hợp cho các cột không được bao gồm trong GROUP BY.

Ngược lại, bằng cách sử dụng các hàm tổng hợp được cửa sổ thay vì GROUP BY, bạn có thể truy xuất cả giá trị tổng hợp và không tổng hợp. Nghĩa là, mặc dù bạn không làm điều đó trong truy vấn mẫu của mình, nhưng bạn có thể truy xuất cả OrderQty riêng lẻ các giá trị và tổng, số đếm, giá trị trung bình của chúng, v.v. trên các nhóm của cùng một SalesOrderID s.

Đây là một ví dụ thực tế về lý do tại sao các tập hợp có cửa sổ lại tuyệt vời. Giả sử bạn cần tính phần trăm của tổng mỗi giá trị là bao nhiêu. Nếu không có tổng hợp có cửa sổ, trước tiên bạn phải lấy một danh sách các giá trị tổng hợp và sau đó nối nó trở lại tập hợp hàng ban đầu, tức là như sau:

SELECT
  orig.[Partition],
  orig.Value,
  orig.Value * 100.0 / agg.TotalValue AS ValuePercent
FROM OriginalRowset orig
  INNER JOIN (
    SELECT
      [Partition],
      SUM(Value) AS TotalValue
    FROM OriginalRowset
    GROUP BY [Partition]
  ) agg ON orig.[Partition] = agg.[Partition]

Bây giờ, hãy xem cách bạn có thể làm điều tương tự với tổng hợp có cửa sổ:

SELECT
  [Partition],
  Value,
  Value * 100.0 / SUM(Value) OVER (PARTITION BY [Partition]) AS ValuePercent
FROM OriginalRowset orig

Dễ dàng và sạch sẽ hơn nhiều phải không?



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nhật ký giao dịch SQL Server, Phần 2:Kiến trúc nhật ký

  2. Sử dụng DBCC CLONEDATABASE để tạo bản sao chỉ lược đồ và thống kê của cơ sở dữ liệu người dùng trong SQL Server 2014 SP2

  3. Nhiều câu lệnh INSERT so với một câu lệnh INSERT với nhiều GIÁ TRỊ

  4. Bỏ tất cả các bảng có tên bắt đầu bằng một chuỗi nhất định

  5. Thêm màu hàng xen kẽ vào báo cáo Dịch vụ báo cáo máy chủ SQL