Rumah >pangkalan data >tutorial mysql >Bagaimana untuk PIVOT Jadual Secara Dinamik dan Mengekalkan Rekod Berbeza dengan Peratusan Sifar?

Bagaimana untuk PIVOT Jadual Secara Dinamik dan Mengekalkan Rekod Berbeza dengan Peratusan Sifar?

Susan Sarandon
Susan Sarandonasal
2024-12-28 16:52:10990semak imbas

How to Dynamically PIVOT a Table and Retain Distinct Records with Zero Percentages?

Pertanyaan PIVOT Dinamik untuk Rekod Berbeza

Masalah:

Pertimbangkan jadual berikut:

| Id | Code | percentage | name | name1 | activity |
|---|---|---|---|---|---|
| 1 | Prashant | 43.43 | James | James_ | Running |
| 1 | Prashant | 70.43 | Sam | Sam_ | Cooking |
| 1 | Prashant | 90.34 | Lisa | Lisa_ | Walking |
| 1 | Prashant | 0.00 | James | James_ | Stealing |
| 1 | Prashant | 0.00 | James | James_ | Lacking |
| 1 | Prashant | 73 | Sam | Sam_ | Cooking 1 |

Menggunakan pertanyaan PIVOT standard, ia boleh mencabar untuk mengekalkan rekod yang berbeza dengan peratusan 0.00. Fungsi MAX sering mengabaikan baris ini, mengakibatkan hasil yang tidak lengkap.

Hasil Jangkaan:

| Id | Code | James | James_ | Sam | Sam_ | Lisa | Lisa_ |
|---|---|---|---|---|---|---|---|
| 1 | Prashant | Running | 43.43 | Cooking 1 | 73 | Walking | 90.34 |
| 1 | Prashant | Stealing | 0.00 | Cooking | 3.43 | NULL | NULL |
| 1 | Prashant | Lacking | 0.00 | NULL | NULL | NULL | NULL |

Penyelesaian:

Untuk menyelesaikan isu ini, kami boleh memperkenalkan fungsi ROW_NUMBER() ke dalam pertanyaan PIVOT. Fungsi ini memberikan nombor baris kepada rekod dalam setiap kumpulan nama, memastikan bahawa rekod dengan peratusan 0.00 pun disimpan.

;with cte as (
    select *, ROW_NUMBER() over (partition by name order by percentage desc) ROWNUM
    from table_name
),
cte2 as (
    SELECT Id,Code,ROWNUM,James,James_,Sam,Sam_,Lisa,Lisa_
    FROM cte
    PIVOT(MAX(activity)
          FOR name IN (James,Sam,Lisa)) AS PVTTable PIVOT
          (
          MAX(percentage)
          FOR name1 IN (James_,Sam_,Lisa_)) AS PVTTable1
)
select Id, Code, MAX(James) James, MAX(James_) James_, MAX(Sam) Sam, MAX(Sam_) Sam_, MAX(Lisa) Lisa, MAX(Lisa_) Lisa_
from cte2
group by Id, Code, ROWNUM

Penjelasan:

  • The ungkapan jadual biasa pertama (cte) menambah lajur ROWNUM pada jadual, menyusun rekod dalam setiap kumpulan nama mengikut peratusan dalam tertib menurun.
  • Ungkapan jadual biasa kedua (cte2) kemudian menggunakan fungsi PIVOT untuk menstruktur semula data.
  • Akhir sekali, kami mengumpulkan hasil mengikut Id, Kod dan ROWNUM untuk menggabungkan pangsi keputusan dan mengekalkan rekod peratusan 0.00.

Penting Nota:

Untuk menjadikan pertanyaan dinamik, kami boleh menggantikan nama berkod keras dan nilai name1 dengan pembolehubah dinamik yang boleh diisi pada masa jalan. Ini membolehkan pertanyaan mengendalikan jadual dengan bilangan lajur yang berbeza-beza.

Atas ialah kandungan terperinci Bagaimana untuk PIVOT Jadual Secara Dinamik dan Mengekalkan Rekod Berbeza dengan Peratusan Sifar?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn