我嘗試搜尋帖子,但只找到了 SQL Server/Access 的解決方案。我需要 MySQL (5.X) 中的解決方案。
我有一個包含 3 個欄位的表格(稱為歷史記錄):hostid、itemname、itemvalue。
如果我執行選擇(select * from History
),它將返回
+--------+----------+-----------+ | hostid | itemname | itemvalue | +--------+----------+-----------+ | 1 | A | 10 | +--------+----------+-----------+ | 1 | B | 3 | +--------+----------+-----------+ | 2 | A | 9 | +--------+----------+-----------+ | 2 | C | 40 | +--------+----------+-----------+
如何查詢資料庫以傳回類似內容
+--------+------+-----+-----+ | hostid | A | B | C | +--------+------+-----+-----+ | 1 | 10 | 3 | 0 | +--------+------+-----+-----+ | 2 | 9 | 0 | 40 | +--------+------+-----+-----+
我將添加一個更長、更詳細的說明來說明解決此問題的步驟。如果太長,我深表歉意。
我將從您給出的基礎開始,並用它來定義幾個術語,我將在本文的其餘部分使用這些術語。這將是基底表:
這將是我們的目標,漂亮的資料透視表:
history.hostid
欄位中的值將成為資料透視表中的y 值。history.itemname
欄位中的值將變為 x-values(出於顯而易見的原因)。當我必須解決創建資料透視表的問題時,我使用三步驟過程來解決它(帶有可選的第四步):
讓我們將這些步驟應用於您的問題,看看會得到什麼:
第 1 步:選擇感興趣的列。在所需的結果中,
hostid
提供y 值,itemname
提供x 值。第 2 步:使用額外列擴充基底表。我們通常需要每個 x 值一列。回想一下,我們的 x 值欄位是
itemname
:請注意,我們沒有更改行數 - 我們只是添加了額外的列。另請注意
NULL
的模式 -itemname = "A"
的行的新列A
具有非空值,並且其他新列的空值。第 3 步:將擴充表進行分組和聚合。我們需要
按 hostid 分組
,因為它提供了 y 值:(請注意,我們現在每個 y 值一行。) 好的,我們就快到了!我們只需要擺脫那些醜陋的
NULL
即可。第四步:美化。我們將用零替換任何空值,以便結果集看起來更好:
我們就完成了-我們已經使用 MySQL 建立了一個漂亮的資料透視表。
應用此程序時的注意事項:
itemvalue
NULL
,但也可能是0
或""
,這取決於您的特定情況sum
,但是count
和max
也經常使用(max
經常在建立單行時使用)分佈在多行中的“對象”)group by
子句(並且不要忘記select
他們)已知限制: