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

Làm cách nào để tạo chế độ xem hiển thị dữ liệu 4 quý trước?

Hừ! Nếu tôi diễn giải "bốn phần tư trước" là "bốn phần tư cuối cùng có trong dữ liệu", thì đây là một phương pháp.

Trước tiên, bạn có thể nhận được bốn phần tư bằng cách thực hiện:

select distinct p_year, p_quarter
from production p
order by p_year desc, p_quarter desc
limit 4;

Bạn có thể liệt kê chúng bằng cách sử dụng các biến:

select p_year, p_quarter, (@rn := @rn + 1) as enum
from (select distinct p_year, p_quarter
      from production p
      order by p_year desc, p_quarter desc
      limit 4
     ) p cross join
     (select @rn := 0) params

Sau đó, bạn có thể sử dụng điều này trong một truy vấn để xoay vòng dữ liệu:

select p.person_id,
       sum(case when seqnum = 1 then num else 0 end) as num_quarter_1,
       sum(case when seqnum = 2 then num else 0 end) as num_quarter_2,
       sum(case when seqnum = 3 then num else 0 end) as num_quarter_3,
       sum(case when seqnum = 4 then num else 0 end) as num_quarter_4
from production p join
     (select p_year, p_quarter, (@rn := @rn + 1) as seqnum
      from (select distinct p_year, p_quarter
            from production p
            order by p_year desc, p_quarter desc
            limit 4
           ) p cross join
           (select @rn := 0) params
     ) yq
     using (p_year, p_quarter)
group by p.person_id;

CHỈNH SỬA:

Nếu bạn đang xác định các quý dựa trên quý hiện tại, bạn có thể làm điều gì đó tương tự:

select p.person_id,
       sum(case when seqnum = 1 then num else 0 end) as num_quarter_1,
       sum(case when seqnum = 2 then num else 0 end) as num_quarter_2,
       sum(case when seqnum = 3 then num else 0 end) as num_quarter_3,
       sum(case when seqnum = 4 then num else 0 end) as num_quarter_4
from production p join
     (select year(curdate()) as p_year, quarter(curdate()) as p_quarter, 1 as seqnum union all
      select year(curdate() - interval 1 quarter) as p_year, month(curdate() - interval 1 quarter) as p_quarter, 2 as seqnum union all
      select year(curdate() - interval 2 quarter) as p_year, month(curdate() - interval 2 quarter) as p_quarter, 3 as seqnum union all
      select year(curdate() - interval 2 quarter) as p_year, month(curdate() - interval 3 quarter) as p_quarter, 4 as seqnum           
     ) yq
     using (p_year, p_quarter)
group by p.person_id;

Có các cách tiếp cận khác, chẳng hạn như:

select person_id,
       sum(case when year(curdate()) = p_year and quarter(curdate()) = p_quarter
                then num else 0
           end) as num_quarter_1,
       sum(case when year(curdate() - interval 1 quarter) = p_year and quarter(curdate() - interval 1 quarter) = p_quarter
                then num else 0
           end) as num_quarter_2,
       sum(case when year(curdate() - interval 2 quarter) = p_year and quarter(curdate() - interval 2 quarter) = p_quarter
                then num else 0
           end) as num_quarter_3,
       sum(case when year(curdate() - interval 3 quarter) = p_year and quarter(curdate() - interval 3 quarter) = p_quarter
                then num else 0
           end) as num_quarter_4
from production p
group by person_id;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Truy vấn GTFS để liệt kê tất cả thời gian khởi hành và đến giữa hai tên điểm dừng

  2. Làm thế nào để tính toán tỷ lệ phần trăm tăng từ hàng trước đó / ngày sau khi Nhóm By phức tạp?

  3. Làm thế nào để mô phỏng tham gia bên ngoài đầy đủ trong truy vấn này?

  4. CHÈN VÀO Bảng từ nhiều bảng

  5. MySQL:Chỉ mục tối ưu cho giữa các truy vấn