Mengelakkan Kehilangan Data dalam Pertanyaan PIVOT untuk Rekod Berbeza
Masalah:
Pertanyaan PIVOT berguna untuk penstrukturan semula data untuk memaparkan maklumat dengan lebih teratur. Walau bagaimanapun, apabila berurusan dengan rekod yang berbeza, fungsi pengagregatan MAX boleh menyebabkan nilai sifar ditinggalkan, yang membawa kepada data yang tidak lengkap.
Penyelesaian:
Untuk mengekalkan semua rekod yang berbeza, walaupun rekod tersebut dengan nilai sifar, seseorang boleh memasukkan fungsi ROW_NUMBER() ke dalam pertanyaan PIVOT. Pendekatan ini memberikan nombor baris pada setiap rekod, mengekalkan perkaitan antara aktiviti dan peratusan.
;with cte as ( select *, ROW_NUMBER() over (partition by name order by percentage desc) ROWNUM from A ), 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
Contoh:
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 |
Sebelum ini, pertanyaan PIVOT standard akan menghasilkan perkara berikut hasil:
Id | Code | James | James_ | Sam | Sam_ | Lisa | Lisa_ |
---|---|---|---|---|---|---|---|
1 | Prashant | Running | 43.43 | Cooking 1 | 73 | Walking | 90.34 |
1 | Prashant | Stealing | 0.0 | Cooking | 3.43 | NULL | NULL |
1 | Prashant | NULL | NULL | NULL | NULL | NULL | NULL |
Walau bagaimanapun, dengan menggabungkan fungsi ROW_NUMBER(), pertanyaan yang diubah suai mengekalkan semua rekod yang berbeza:
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 |
Pendekatan ini memastikan semua aktiviti yang berbeza dipaparkan, walaupun yang dengan nilai peratusan sifar, memberikan perwakilan data yang lebih tepat.
Atas ialah kandungan terperinci Bagaimana untuk Mengelakkan Kehilangan Data Apabila Menggunakan Pertanyaan PIVOT pada Rekod Berbeza dengan Nilai Sifar?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!