首頁 >資料庫 >mysql教程 >如何建立保留不同記錄的動態 PIVOT 查詢?

如何建立保留不同記錄的動態 PIVOT 查詢?

Barbara Streisand
Barbara Streisand原創
2024-12-24 02:15:10289瀏覽

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

保留不同記錄的動態PIVOT 查詢

問題:

問題:

問題:

PMAX () 聚合來匯總數據,這可能會導致不同值的遺失。例如,在具有相同名稱的多個活動記錄的表中,PIVOT 可能會忽略 MAX() 值較低的記錄。

目標:

  1. 創建動態PIVOT保留不同記錄及其相應百分比的查詢
  2. 解決方案:
  3. 引入ROW_NUMBER()分區: 在執行之前新增按名稱列分區的 ROW_NUMBER()樞。這會將唯一的行號指派給不同的名稱行,同時保留百分比排序。
對分區資料進行透視:
;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
使用 ROW_NUMBER() 作為 PIVOT 查詢中的附加欄位。輸出將匹配不同的名稱行及其各自的活動和百分比。

重新分組以進行動態聚合:

資料透視後,依 Id、Code 和 ROW_NUMBER() 將資料分組。此步驟組合每個不同名稱行的百分比值。

動態查詢生成:

對於動態查詢生成,請替換逗號分隔的列表名稱(@name_concat, @name1_concat) 和SELECT MAX () 聚合(@select_aggs),其變數可以是在執行時填入。
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
範例結果:查詢回傳所需的輸出,保留不同的名稱行及其百分比:

以上是如何建立保留不同記錄的動態 PIVOT 查詢?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn