MySQL數(shù)據(jù)庫中的橫表就是指豎向排列的數(shù)據(jù)通過類似于EXCEL中的'行列轉(zhuǎn)換'操作,將其變更為橫向排列的表格形式。而動態(tài)橫表轉(zhuǎn)置又稱為“動態(tài)透視表”,是指在沒有固定列的情況下,將豎向數(shù)據(jù)轉(zhuǎn)化為動態(tài)的橫向表格形式。這樣可以方便地進(jìn)行數(shù)據(jù)的統(tǒng)計和分析。
CREATE PROCEDURE SP_GET_PERSON_RECORDS(IN DATEFROM date, IN DATETO date) BEGIN DECLARE SQLString varchar(4000); DECLARE Rows varchar(250); DECLARE result varchar(4000); SET @SQLString = ''; SELECT GROUP_CONCAT(DISTINCT CONCAT( 'MAX(IF(date = ''', date, ''', COUNT, 0)) AS ', DATE_FORMAT(date, '%d-%m-%Y') ) ) INTO @Columns FROM person_records WHERE date BETWEEN DATEFROM AND DATETO; SET @SQLString = CONCAT( 'SELECT name, ', @Columns, ' FROM person_records WHERE date BETWEEN ''', DATEFROM, ''' AND ''', DATETO, ''' GROUP BY name '); PREPARE stmt FROM @SQLString; EXECUTE stmt; DEALLOCATE PREPARE stmt; END
以上代碼中定義了一個存儲過程,用于將給定日期內(nèi)的人員的記錄轉(zhuǎn)換為動態(tài)的橫向表格形式。通過將記錄行的“日期”列中的不同日期作為“列”的名稱,并使用計數(shù)器統(tǒng)計值進(jìn)行填充,最后將每個人員的匯總轉(zhuǎn)換到行集中,這個過程實現(xiàn)了橫向表格的轉(zhuǎn)換。存儲過程接受兩個參數(shù),即DATETFROM和DATETO,其將提取此日期范圍內(nèi)的所有記錄并生成動態(tài)橫向表格。