Mysql tính tỷ lệ phần trăm của hai cột

Tôi có 2 bảng t1 nơi giá và loại mặt hàng được lưu trữ với giá trị ENUM và t2 nơi lưu trữ số lượng đã bán. Tôi có truy vấn để tính tổng doanh số bán hàng [giá * số lượng] nhưng tôi cần tính chênh lệch giữa 2 số kết quả

Công thức tính hiệu giữa 2 số phải là

[[N1 - N2]/[[N1 + N2]/2]] * 100

Sử dụng công thức trên, tôi cần tính sự khác biệt về tỷ lệ phần trăm giữa N1 và N2. Cả hai số đều là kết quả của 2 trường hợp SUM riêng biệt dựa trên 2 giá trị ENUM trong col_type [vui lòng xem bên dưới]

SELECT
  CONCAT['£ ',SUM[CASE WHEN t1.col_type = 'N1' THEN t2.qty * t1.price ELSE 0 END]] AS 'Total N1',
  CONCAT['£ ',SUM[CASE WHEN t1.col_type = 'N2' THEN t2.qty * t1.price ELSE 0 END]] AS 'Total N2'            
FROM t2
  INNER JOIN t1
    ON t2.col_id = t1.col_id

Kết quả đầu ra sẽ giống như

+----------+----------+------------------------+
| Total N1 | Total N2 | Diff between N1 and N2 |
+----------+----------+------------------------+
|  3765.50 |  3246.15 | 14.81%                 |
+----------+----------+-----------------------

Câu hỏi của tôi là làm cách nào để chuyển các giá trị của N1 và N2 [đã được tạo] sang cột thứ 3 và tính toán sự khác biệt giữa N1 và N2 bằng công thức trên?

Ghi chú. Xin lưu ý rằng đó là phần trăm chênh lệch giữa 2 số và không phải phần trăm thay đổi khi áp dụng [N2-N1] / N1 * 100

Câu hỏi này xuất hiện thường xuyên khi bạn muốn đóng góp tương đối của một hàng trong bối cảnh tổng của tất cả các hàng. Ví dụ

  • thị phần trình duyệt thay đổi như thế nào theo thời gian
  • đóng góp của mỗi nhân viên bán hàng vào doanh thu của công ty bạn là gì

Xem xét một bảng với số lượt xem trang [tính bằng tỷ] với mỗi trình duyệt

Trình duyệtLượt xem trangChrome7. 1685Safari1. 935Firefox1. Trình duyệt 3455UC1. 0965IE1. 341Opera0. 816Android0. 7245Phần còn lại1. 2

Điều chúng tôi thực sự muốn thấy là thị phần trình duyệt. Chúng tôi có thể sử dụng Biểu thức bảng chung [CTE] để tính tổng số lần xem trang mà sau đó chúng tôi sử dụng để tính tỷ lệ

with total as
    [ select sum[pageviews] as total
    from pageviews ]
select browser,
    pageviews / total.total as share
from pageviews,
    total

Cung cấp tỷ lệ của từng trình duyệt trên tổng số

Trình duyệtChia sẻChrome0. 895Safari0. 241875Firefox0. 1681875UC Trình duyệt0. 1370625IE0. 167625Opera0. 102Android0. 0905625Nghỉ0. 15

Và hình dung

Tỷ lệ phần trăm trên tổng số mỗi nhóm

Câu hỏi tiếp theo là làm thế nào điều này đang thay đổi theo thời gian?

Những gì chúng tôi đang cố gắng làm ở đây là nhóm dữ liệu của chúng tôi thành các tháng, tính tổng cho nhóm đó và cho mỗi hàng trong nhóm đó tính tỷ lệ. Một tổng số tổng thể sẽ không có ý nghĩa. Xem xét bảng số lần truy cập trang như trước, nhưng có thêm trường ngày

dtBrowserPageviews2016-01-01Chrome7. 16852016-01-01Safari1. 9352016-01-01. 2016-01-02Chrome7. 24852016-01-02Safari1. 7212016-01-02. 2016-12-31Chrome7. 8642016-12-31Safari2. 0112016-12-31

Một lần nữa, chúng tôi sử dụng các chức năng cửa sổ với một phân vùng trên phần tháng của ngày giờ

select date_trunc['month', dt],
    browser,
    pageviews / sum[pageviews] over[partition by date_trunc['month', dt]]
from pageviews 

Hãy giải nén truy vấn một chút. Chức năng cửa sổ của chúng tôi tạo các phân vùng [nhóm] cho mỗi tháng và đối với mỗi phân vùng, chúng tôi tổng hợp các lần xem trang. Tỷ lệ giữa số lần xem trang của hàng hiện tại và tổng số cho nhóm đó chính xác là những gì chúng tôi muốn

Dịch chuyển đỏ có ratio_to_report

May mắn thay trên Redshift, nó hỗ trợ một hàm cửa sổ có tên là

+----------+----------+------------------------+
| Total N1 | Total N2 | Diff between N1 and N2 |
+----------+----------+------------------------+
|  3765.50 |  3246.15 | 14.81%                 |
+----------+----------+-----------------------
0 tính toán tỷ lệ giá trị của một cột trong một hàng với tổng của biểu thức đã nói trên nhóm

Đối với điều này, bạn có thể sử dụng CONCAT[] và round[]. Trước tiên chúng ta hãy tạo một bảng -

mysql> create table DemoTable1844
     [
     Number int,
     TotalNumber int
     ];
Query OK, 0 rows affected [0.00 sec]

Chèn một số bản ghi vào bảng bằng lệnh chèn -

mysql> insert into DemoTable1844 values[50,500];
Query OK, 1 row affected [0.00 sec]
mysql> insert into DemoTable1844 values[80,500];
Query OK, 1 row affected [0.00 sec]
mysql> insert into DemoTable1844 values[98,500];
Query OK, 1 row affected [0.00 sec]
mysql> insert into DemoTable1844 values[45,500];
Query OK, 1 row affected [0.00 sec]

Hiển thị tất cả các bản ghi từ bảng bằng câu lệnh select -

mysql> select * from DemoTable1844;

Điều này sẽ tạo ra đầu ra sau -

+--------+-------------+
| Number | TotalNumber |
+--------+-------------+
|     50 |         500 |
|     80 |         500 |
|     98 |         500 |
|     45 |         500 |
+--------+-------------+
4 rows in set [0.00 sec]

Đây là truy vấn để tính tỷ lệ phần trăm trong một truy vấn và làm tròn kết quả -

________số 8

Điều này sẽ tạo ra đầu ra sau -

+--------+
| Result |
+--------+
| 10.00% |
| 16.00% |
| 19.60% |
| 9.00%  |
+--------+
4 rows in set [0.00 sec]

Chủ Đề