sql 行列互轉

一、行轉列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 
相關文章
相關標籤/搜索