SQL行轉列

記錄一下。
假如現在有一個表結構如下圖:

表中數據如下圖:

最後結果圖:

首先講一下我對行車列的理解:
 從圖中可以看到是將workDays列進行了行轉列操作。前兩列是沒有變的。那麼前兩句的代碼就可以這樣寫:
SELECT ID,UserName,
接着是將workDays字段進行行轉列操作,可以這樣寫:
    MAX(CASE WorkDays WHEN '2' then so else NULL end) [2],
    MAX(CASE WorkDays WHEN '3' then so else NULL end) [3],
    MAX(CASE WorkDays WHEN '6' then so else NULL end) [6], 
    MAX(CASE WorkDays WHEN '9' then so else NULL end) [9]
最後帶上從哪個表查的:
FROM RowToLie GROUP BY ID,UserName
寫在一塊兒:
SELECT ID,UserName,
    MAX(CASE WorkDays WHEN '2' then so else NULL end) [2],
    MAX(CASE WorkDays WHEN '3' then so else NULL end) [3],
    MAX(CASE WorkDays WHEN '6' then so else NULL end) [6], 
    MAX(CASE WorkDays WHEN '9' then so else NULL end) [9]
FROM RowToLie GROUP BY ID,UserName
到這兒再回過頭看看,行轉列就是將要轉的那一列的值取出來,但是是去重後的。分別使用case when語句。but!!!
有些時間可能不知道某一列有多少個不同的數據,這個時候就要用上拼SQL啦。直接貼出上面這個例子的拼SQL版:
DECLARE @sql VARCHAR(8000)
SET @sql = 'SELECT ID,UserName'
SELECT @sql = @sql + ',MAX(CASE WorkDays WHEN ''' + WorkDays + ''' then so else NULL end) [' + WorkDays + ']'
FROM (SELECT DISTINCT WorkDays FROM RowToLie) AS a
SET @sql = @sql + ' FROM RowToLie GROUP BY ID,UserName'
print @sql
EXEC(@sql)
第三行和第四行是一個重點。第三行是迭代出了某列所有不同的值,而第四行是取出某列所有不同的值。
這就是我理解的行轉列。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章