close
最近有一個需球要將資料用v-chart畫出堆疊圖,但資料sql table
原本是長這樣
飲料店 | 區域 | 人數 |
---|---|---|
CXCX | 台北 | 5 |
CXCX | 桃園 | 4 |
CXCX | 新北 | 2 |
XO嵐 | 台北 | 10 |
XO嵐 | 桃園 | 4 |
XO嵐 | 新北 | 7 |
清X | 台北 | 3 |
清X | 桃園 | 4 |
清X | 新北 | 10 |
要轉成樞紐資料,變成這樣
飲料店 | 台北 | 桃園 | 新北 |
---|---|---|---|
CXCX | 5 | 4 | 2 |
XO嵐 | 10 | 4 | 7 |
清X | 3 | 4 | 10 |
接著用sql語法組動態
產生的話會需要這樣寫
SET SESSION GROUP_CONCAT_MAX_LEN = 10000000;
SET @sql = NULL;
SELECT GROUP_CONCAT(DISTINCT
CONCAT('SUM(CASE WHEN c.area = "', c.area,'" AND ',
(CASE WHEN c.total_area IS NOT NULL
THEN CONCAT('c.total_area = ',c.total_area)
ELSE NULL END),
' THEN c.total_area else 0 end) AS ','"',
c.shop_name,'_',c.area,'"'
)
)
INTO @sql
FROM (SELECT b.shop_name,b.area,COUNT(b.area) total_area
FROM drink_shop b
WHERE b.shop_name IS NOT NULL
GROUP BY b.shop_name,b.area) c;
SET @sql = CONCAT('SELECT c.shop_name, ', @sql,
' FROM (SELECT b.shop_name,b.area,
COUNT(b.area) total_area
FROM drink_shop b
WHERE b.shop_name IS NOT NULL
GROUP BY b.shop_name,b.area) c
GROUP BY c.shop_name');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
這邊有一個很重要的點!!
如果你GROUP_CONCAT
組出來的字串很長一定要先設定GROUP_CONCAT_MAX_LEN
的長度
預設是1024個字元,一開始我沒注意到一直ERROR,後來SELECT出來看才知道超過1024結果字元都被截斷...
上面是動態產生適合資料會變動並且很多的時候
如果你要輸出的欄位沒有很多其實可以用下面的方法
SELECT
c.shop_name,
SUM(CASE WHEN c.area='台北' then c.total_area ELSE 0 END) AS column_taipei,
SUM(CASE WHEN c.area='桃園' then c.total_area ELSE 0 END) AS column_taoyuan,
SUM(CASE WHEN c.area='新北' then c.total_area ELSE 0 END) AS column_newtaipei
FROM (SELECT b.shop_name,b.area,COUNT(b.area) total_area
FROM drink_shop b
WHERE 1=1
AND b.shop_name IS NOT NULL
GROUP BY b.shop_name,b.area) c
GROUP BY c.shop_name;
搞了一下才瞭解SQL其實可以很好玩
文章標籤
全站熱搜
留言列表