一、行轉列sql
現有數據:函數
指望數據:xml
1.1建表建數據blog
IF OBJECT_ID('temp_20170701','u') IS NOT NULL DROP TABLE temp_20170701 CREATE TABLE temp_20170701 ( ID INT PRIMARY KEY IDENTITY(1,1), NAME NVARCHAR(50), Subjectname NVARCHAR(50), Score INT ) INSERT dbo.temp_20170701( Name, subjectname, Score ) SELECT 'A','語文','20' UNION SELECT 'A','數學','30' UNION SELECT 'A','英語','40' UNION SELECT 'B','語文','50' UNION SELECT 'B','數學','60' UNION SELECT 'B','英語','70' UNION SELECT 'C','語文','80' UNION SELECT 'C','數學','90' UNION SELECT 'C','英語','100' UNION SELECT 'D','英語','100'
1.2 .1 靜態實現數學
SELECT Name , MAX(CASE WHEN subjectname='語文' THEN Score ELSE 0 END)語文 , MAX(CASE WHEN subjectname='數學' THEN Score ELSE 0 END)數學, MAX(CASE WHEN subjectname='英語' THEN Score ELSE 0 END)英語 FROM dbo.temp_20170701 GROUP BY Name
1.2.2 動態實現 string
DECLARE @sql varchar(500) SET @sql='select Name ' SELECT @sql=@sql+',max(case subjectname when '''+subjectname+''' then Score else 0 end)['+subjectname+']' FROM(SELECT DISTINCT subjectname FROM temp_20170701)a SET @sql=@sql+' from temp_20170701 group by Name' --SELECT @sql EXEC(@sql)
二、行轉列 逗號隔開class
現有數據如1的第一張圖select
指望數據:im
2.一、使用xml pathd3
SELECT Name ,Score=STUFF((SELECT ','+CONVERT(NVARCHAR(max),Score) FROM temp_20170701 t1 WHERE t1.NAME=t2.NAME FOR XML PATH('')),1,1,'') FROM temp_20170701 t2 GROUP BY t2.NAME
2.二、使用 函數
CREATE FUNCTION [dbo].[HConvertL] ( @GroupId nvarchar(max) ) RETURNS [nvarchar](max) AS BEGIN DECLARE @ReturnValue [nvarchar](max) SET @ReturnValue = '' SELECT @ReturnValue=@ReturnValue + RTRIM(LTRIM(Score)) + ',' FROM temp_20170701 WHERE NAME = @GroupId SET @ReturnValue = ','+@ReturnValue --substring(@ReturnValue,1,len(@ReturnValue)-1) RETURN @ReturnValue END SELECT DISTINCT Name,dbo.[HConvertL](name) Score FROM temp_20170701
三、列轉行
原始數據:
指望數據:
3.1建表建數據
IF OBJECT_ID('tempdb..#temp_20170701_02','U') IS NOT NULL DROP TABLE #temp_20170701_02 CREATE TABLE #temp_20170701_02 ( ID INT PRIMARY KEY IDENTITY(1,1), NAME NVARCHAR(50), 語文 INT NOT NULL DEFAULT 0, 數學 INT NOT NULL DEFAULT 0, 英語 INT NOT NULL DEFAULT 0 ) INSERT #temp_20170701_02( NAME, 語文, 數學, 英語 ) SELECT 'A',20,30,40 UNION SELECT 'B',50,60,70 UNION SELECT 'C',80,90,100 UNION SELECT 'D',100,0,0
3.2 使用UNPIVOT實現
SELECT Name , SubjectName , Score FROM #temp_20170701_02 UNPIVOT ( Score FOR SubjectName IN ( 語文, 數學, 英語 ) ) #temp_20170701_02