資料庫操作--行列轉換
阿新 • • 發佈:2018-12-03
在資料庫操作的時候會碰到行列轉換,最經典的屬於姓名-學科-成績表了。
表 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