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

Tính toán phần trăm từ SUM () trong cùng một truy vấn SELECT sql

Câu hỏi này còn nhiều điều hơn bạn tưởng.

Phiên bản đơn giản

Đây là nhiều nhanh hơn và đơn giản hơn:

SELECT property_name
      ,(count(value_a = value_b OR NULL) * 100) / count(*) AS pct
FROM   my_obj
GROUP  BY 1;

Kết quả:

property_name | pct
--------------+----
 prop_1       | 17
 prop_2       | 43

Làm thế nào?

  • Bạn không cần một chức năng nào cho việc này.

  • Thay vì đếm value_b (mà bạn không cần bắt đầu bằng) và tính tổng, sử dụng count(*) cho tổng số. Nhanh hơn, đơn giản hơn.

  • Điều này giả sử bạn không có NULL các giá trị. I E. cả hai cột đều được xác định NOT NULL . Thông tin bị thiếu trong câu hỏi của bạn.
    Nếu không, truy vấn ban đầu của bạn có thể không hoạt động như bạn nghĩ . Nếu bất kỳ giá trị nào là NULL, phiên bản của bạn hoàn toàn không tính hàng đó. Bạn thậm chí có thể kích động chia cho không ngoại lệ theo cách này.
    Phiên bản này cũng hoạt động với NULL. count(*) tạo ra số lượng tất cả các hàng, bất kể giá trị.

  • Đây là cách bộ đếm hoạt động:

     TRUE  OR NULL = TRUE
     FALSE OR NULL = NULL
    

    count() bỏ qua giá trị NULL. Voilá.

  • Mức độ ưu tiên của toán tử chi phối rằng = liên kết trước OR . Bạn có thể thêm dấu ngoặc đơn để làm rõ ràng hơn:

    count ((value_a = value_b) OR FALSE)
    
  • Bạn có thể làm tương tự với

    count NULLIF(<expression>, FALSE)
    
  • Loại kết quả của count()bigint theo mặc định.
    Một bộ phận bigint / bigint , cắt bớt chữ số phân số .

Bao gồm các chữ số phân số

Sử dụng 100.0 (với chữ số phân số) để buộc phép tính là numeric và do đó giữ nguyên các chữ số phân số.
Bạn có thể muốn sử dụng round() với cái này:

SELECT property_name
      ,round((count(value_a = value_b OR NULL) * 100.0) / count(*), 2) AS pct
FROM   my_obj
GROUP  BY 1;

Kết quả:

property_name | pct
--------------+-------
 prop_1       | 17.23
 prop_2       | 43.09

Ngoài ra:
Tôi sử dụng value_a thay vì valueA . Không sử dụng các mã nhận dạng chữ hoa-thường chưa được trích dẫn trong PostgreSQL. Tôi đã thấy quá nhiều câu hỏi tuyệt vọng đến từ sự điên rồ này. Nếu bạn thắc mắc tôi đang nói về điều gì, hãy đọc chương Số nhận dạng và Từ khóa trong sách hướng dẫn.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL CHẨN ĐOÁN BẬT với các ĐẶT HÀNG KHÁC BỞI

  2. hàm trả về nhiều cột dưới dạng một cột duy nhất thay vì nhiều cột

  3. trình tự thoát cho gạch nối (-) trong PostgreSQL là gì

  4. Cài đặt Odoo trên Mac Không thể Thực thi Lệnh LESSC

  5. JPA tuôn ra so với cam kết