首頁 > 資料庫 > mysql教程 > 如何在不聚合的情況下在 SQL 中執行動態透視?

如何在不聚合的情況下在 SQL 中執行動態透視?

Susan Sarandon
發布: 2025-01-07 22:51:44
原創
936 人瀏覽過

How to Perform Dynamic Pivoting in SQL Without Aggregation?

動態透視:巧妙地將行轉換為列

動態SQL語句是建立彈性查詢的強大工具。本文將重點放在如何在不使用聚合函數的情況下,將行轉換為列。

理解動態透視

透視操作通常使用SUM或MAX等聚合函數。然而,在某些情況下,直接取得值透視是可取的。這需要一種略微不同的方法。

例如,考慮以下來源表:

<code>╔═══════════╦══════╦═══════╗
║ TEST_NAME ║ SBNO ║  VAL  ║
╠═══════════╬══════╬═══════╣
║ Test1     ║    1 ║ 0.304 ║
║ Test1     ║    2 ║ 0.31  ║
║ Test1     ║    3 ║ 0.306 ║
║ Test2     ║    1 ║ 2.3   ║
║ Test2     ║    2 ║ 2.5   ║
║ Test2     ║    3 ║ 2.4   ║
║ Test3     ║    1 ║ PASS  ║
║ Test3     ║    2 ║ PASS  ║
╚═══════════╩══════╩═══════╝</code>
登入後複製

期望的輸出是一個類似以下的透視表:

<code>╔══════════════════════════╗
║ SBNO Test1 Test2   Test3 ║
╠══════════════════════════╣
║ 1    0.304  2.3    PASS  ║
║ 2    0.31   2.5    PASS  ║
║ 3    0.306  2.4    NULL  ║
╚══════════════════════════╝</code>
登入後複製

無聚合函數的動態透視

為了在不使用聚合函數的情況下實現此結果,我們可以利用PIVOT函數。由於VAL列包含varchar數據,我們可以利用MAX聚合函數。

硬編碼透視

對於數量有限的測試,我們可以如下硬編碼列名:

<code class="language-sql">select sbno, Test1, Test2, Test3
from
(
  select test_name, sbno, val
  from yourtable
) d
pivot
(
  max(val)
  for test_name in (Test1, Test2, Test3)
) piv;</code>
登入後複製

可擴充的動態透視

對於大量的測試,動態SQL提供了一個可擴展的解決方案:

<code class="language-sql">DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(TEST_NAME) 
                    from yourtable
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT sbno,' + @cols + '
             from 
             (
                select test_name, sbno, val
                from yourtable
            ) x
            pivot 
            (
                max(val)
                for test_name in (' + @cols + ')
            ) p '

execute(@query)</code>
登入後複製

兩種方法都會產生相同的期望輸出。此範例示範如何利用動態SQL來建立靈活且高效的解決方案,以解決複雜的資料處理任務。

以上是如何在不聚合的情況下在 SQL 中執行動態透視?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板