MySQL縱表變橫表
MySQL是一個(gè)流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),可用于存儲(chǔ)和管理結(jié)構(gòu)化數(shù)據(jù)。在MySQL中,表通常是縱向組織的,即每行表示一個(gè)實(shí)例,每列表示一個(gè)屬性。但在某些情況下,需要將縱向數(shù)據(jù)轉(zhuǎn)換為橫向數(shù)據(jù),以便更輕松地查詢和分析數(shù)據(jù)。
橫表的結(jié)構(gòu)
橫表包含許多列,每列存儲(chǔ)一個(gè)屬性的值。橫表的第一列是通常是引用屬性,而其他列則是各個(gè)屬性的實(shí)際值。例如,可以將表行的商品屬性和值拆分為列,如下圖所示:
商品ID | 名稱 | 價(jià)格 | 顏色
1 | iPhone 6 | 2000 | 灰色
2 | Galaxy S6 | 1700 | 白色
縱表轉(zhuǎn)換為橫表
要將MySQL中的縱向表轉(zhuǎn)換為橫向表,需要使用SQL中的PIVOT或CASE語句。PIVOT語句將縱向表中的數(shù)據(jù)旋轉(zhuǎn),從而將列的值作為新列,行中的值作為新行。而CASE語句可用于在查詢結(jié)果中創(chuàng)建新列,將原始列中的值分組并計(jì)算值。
實(shí)現(xiàn)方式
構(gòu)建橫表的方法取決于數(shù)據(jù)的形式和查詢所需的結(jié)果。如果數(shù)據(jù)較少,可以使用CASE語句手動(dòng)創(chuàng)建橫表。例如:
SELECT
商品ID,
SUM(CASE WHEN 屬性名稱= '名稱' THEN 屬性值 ELSE '' END) AS 名稱,
SUM(CASE WHEN 屬性名稱= '價(jià)格' THEN 屬性值 ELSE '' END) AS 價(jià)格
FROM 表名
GROUP BY 商品ID;
否則,可以使用動(dòng)態(tài)SQL,并在查詢結(jié)果中生成CREATE TABLE語句。例如:
SELECT
CONCAT('CREATE TABLE 橫表名 (
',
'ID INT,',
(SELECT DISTINCT CONCAT('`',屬性名稱,'`',' VARCHAR(100),') FROM 表名),
'PRIMARY KEY(ID));' )
FROM 表名;
以上就是MySQL縱表變橫表的一些基本知識(shí)。通過這種方法可以將大量縱向數(shù)據(jù)轉(zhuǎn)換為易于查詢和分析的橫向數(shù)據(jù)。但需要注意的是,使用橫向表可能會(huì)增加數(shù)據(jù)冗余和查詢復(fù)雜性。