Rumah > pangkalan data > tutorial mysql > Bagaimana untuk Mencipta Pertanyaan PIVOT Dinamik yang Memelihara Rekod Berbeza?

Bagaimana untuk Mencipta Pertanyaan PIVOT Dinamik yang Memelihara Rekod Berbeza?

Barbara Streisand
Lepaskan: 2024-12-24 02:15:10
asal
290 orang telah melayarinya

How to Create a Dynamic PIVOT Query that Preserves Distinct Records?

Pertanyaan PIVOT Dinamik untuk Memelihara Rekod Yang Berbeza

Masalah:

Pertanyaan PIVOT sering menggunakan MAX () pengagregatan untuk meringkaskan data, yang boleh mengakibatkan kehilangan nilai yang berbeza. Sebagai contoh, dalam jadual dengan berbilang rekod aktiviti untuk nama yang sama, PIVOT mungkin mengabaikan rekod dengan nilai MAX() yang lebih rendah.

Objektif:

Buat PIVOT dinamik pertanyaan yang mengekalkan rekod yang berbeza dan peratusan yang sepadan nilai.

Penyelesaian:

  1. Perkenalkan ROW_NUMBER() Pembahagian: Tambah ROW_NUMBER() dengan pembahagian mengikut lajur nama sebelum melaksanakan PIVOT. Ini memberikan nombor baris unik kepada baris nama yang berbeza sambil mengekalkan susunan peratusan.
  2. Pangsi pada Data Terbahagi: Gunakan ROW_NUMBER() sebagai lajur tambahan dalam pertanyaan PIVOT. Output akan memadankan baris nama yang berbeza dengan aktiviti dan peratusan masing-masing.
  3. Kumpul semula untuk Pengagregatan Dinamik: Selepas berputar, kumpulkan data mengikut Id, Kod dan ROW_NUMBER(). Langkah ini menggabungkan nilai peratusan untuk setiap baris nama yang berbeza.
;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
Salin selepas log masuk

Penjanaan Pertanyaan Dinamik:

Untuk penjanaan pertanyaan dinamik, gantikan senarai yang dipisahkan koma daripada nama (@name_concat, @name1_concat) dan SELECT MAX() agregasi (@select_aggs) dengan pembolehubah yang boleh diisi pada masa jalan.

Contoh Hasil:

Pertanyaan mengembalikan output yang diingini, mengekalkan baris nama yang berbeza dan peratusannya:

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
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk Mencipta Pertanyaan PIVOT Dinamik yang Memelihara Rekod Berbeza?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan