1. 程式人生 > >資料庫操作--行列轉換

資料庫操作--行列轉換

在資料庫操作的時候會碰到行列轉換,最經典的屬於姓名-學科-成績表了。
表 student

姓名 (name) 學科(subject) 成績 (grade)
張三 語文 80
張三 數學 90
張三 英語 70
李四 語文 70
李四 數學 80
李四 英語 90

需要顯示為

姓名 語文 數學 英語
張三 80 90 70
李四 70 80 90

那應該怎麼寫sql 呢?
最先想到的是分組,發現不好使。這裡需要用到 PIVOT(列傳行)/UNPIVOT(行轉列) 關鍵字。

語法:語法太麻煩了哈哈,還是就這個例子來寫吧,這個應該是最簡單的行列轉換了。
	
	select  name,語文,數學,英語 from studrnt as A 
	pivot( grade for subject in('語文',‘數學’,‘英語’))

--沒有試驗一下對不對哈哈,感覺沒錯。

PIVOT(取值的列(可以是該列的聚合函式) FOR 列名(將這列的值轉為列的這一列) IN (Q1,Q2,..))

貼上我寫的試驗過的行列轉換

SELECT city_id AS 地市, [2] AS 咪咕, [3] AS 優酷, [6] AS 騰訊視訊, [14] AS 樂視視訊, [17] AS 愛奇藝視訊 
  from (
    select city_id,subservice_id,convert(float,sum(DlTraffic500)/sum(DlTraffic500/HttpDlRate500))AS rate 
    from LTE_NRTM_Subservice_YN 
    where service_id=5 and starttimehh=20181015210000000 and subservice_id in(2,3,6,14,17) 
    group by subservice_id,city_id) AS LTE 
  PIVOT(AVG(rate) FOR subservice_id IN ([2],[3],[6],[14],[17])

列傳行是一樣的,把關鍵字換成UNPIVOT

另:
修改一張表列的屬性

--修改表列的屬性
ALTER TABLE LTE_NRTM_Subservice_YN
    ALTER COLUMN DlTraffic500 float