sunil mali Ответов: 1

Создание нескольких столбцов в нескольких строках в SQL


Всем Привет,

У меня есть таблица, которую мне нужно преобразовать в несколько строк столбцов,

входная таблица
SubHeading_Name	      Pointer_Id   JV	Jan	Feb
Preparation & Planning  	1	   JV1	4	2
Preparation & Planning  	2	   JV1	3	3
Preparation & Planning  	3	   JV1	2	2
Preparation & Planning  	4	   JV1	4	1
Preparation & Planning  	1	   JV2	4	2
Preparation & Planning  	2	   JV2	3	3
Preparation & Planning  	3	   JV2	2	2
Preparation & Planning  	4	   JV2	4	1


Ожидаемый Результат:

	Empty		   |	MonthName    |	     Jan    |      Feb	    |
------------------------------------------------------------------------------
SubHeading_Name		|	Pointer_Id   |	JV1	JV2 |	JV1	JV2 |
------------------------------------------------------------------------------
Preparation & Planning  |	1	     | 	4	4   |	2	2   |
Preparation & Planning  |	2	     |	3	3   |	3	3   |
Preparation & Planning  |	3	     |	2	2   |	2	2   |
Preparation & Planning  |	4	     |	4	4   |	1	1   |


Что я уже пробовал:

 WITH Main as (select ts.SubHeading_Name,tp.Pointer_Id,tp.Pointer_Name
from  [actionline].[Tbl_Altitude_Pointer_Master] tp left join [actionline].[Tbl_Altitude_SubHeading_Master] ts
on ts.SubHeading_Id=tp.SubHeading_Id
),
TB1 as(
select Pointer_Id,SUM(Score) Score,LEFT(DATENAME(MONTH,Created_On),3) Mnth,
'JV'+CONVERT(varchar(10),DENSE_RANK() OVER (ORDER BY Created_On)) AS JV from [actionline].[Tbl_Altitude_SoftSkill_ScorePointer]
where SP='ANAWAB'
group by Created_On,Pointer_Id
),
TB2 as(
SELECT Pointer_Id, JV,  
[Jan], [Feb], [Mar], [Apr], [May], [Jun], [Jul], [Aug], [Sep], [Oct], [Nov], [Dec]
FROM  
(SELECT Pointer_Id,JV,Score,Mnth
    FROM TB1) AS SourceTable  
PIVOT  
(  
SUM(Score)  
FOR Mnth IN ([Jan], [Feb], [Mar], [Apr], [May], [Jun], [Jul], [Aug], [Sep], [Oct], [Nov], [Dec]  )  

) AS PivotTable)
select m.SubHeading_Name,t.* 
from Main m inner join Tb2 t on m.Pointer_Id=t.Pointer_Id
order by Pointer_Id

Santosh kumar Pithani

Создать таблицу #Test ( SubHeading_Name VARCHAR(500),Pointer_Id int,JV VARCHAR(100),JAN INT,FEB INT);
Вставить в #тест
ЦЕННОСТИ
("Подготовка и планирование",1,"СП1",4,2)
,('Подготовка и планирование',2,'СП1',3,3)
,('Подготовка и планирование',3,'СП1',2,2)
,('Подготовка и планирование',4,'СП1',4,1)
,('Подготовка и планирование',1,'СП2',4,2)
,('Подготовка и планирование',2,'СП2',3,3)
,('Подготовка и планирование',3,'СП2',2,2)
,('Подготовка и планирование',4,'СП2',4,1)

ВЫБИРАТЬ
SubHeading_Name,Pointer_Id,
Макс(случай, когда JV1 СП='' затем бросил(января как varchar(10)) конец)+' '+
Макс(случай, когда СП JV2='' затем бросил(января как varchar(10)) конец) как января,
Макс(случай, когда JV1 СП='' затем бросил(февраля как varchar(10)) конец)+' '+
Макс(случай, когда СП JV2='' затем бросил(февраля как varchar(10)) конец) как февраля
Из #test GROUP BY SubHeading_Name,Pointer_Id

1 Ответов

Рейтинг:
8

Santosh kumar Pithani

CREATE TABLE #Test (SubHeading_Name VARCHAR(500),Pointer_Id int,JV VARCHAR(100),
                    Score int,[Month] Varchar(50)
                   );

INSERT INTO #Test(SubHeading_Name,Pointer_Id,JV,Score,[Month]) 

VALUES
 ('Preparation & Planning',1,'JV1',4,'JAN')
,('Preparation & Planning',2,'JV1',3,'JAN')
,('Preparation & Planning',3,'JV1',2,'JAN')
,('Preparation & Planning',4,'JV1',4,'JAN')
,('Preparation & Planning',1,'JV2',4,'JAN')
,('Preparation & Planning',2,'JV2',3,'JAN')
,('Preparation & Planning',3,'JV2',2,'JAN')
,('Preparation & Planning',4,'JV2',4,'JAN')
,('Preparation & Planning',1,'JV1',2,'FEB')
,('Preparation & Planning',2,'JV1',3,'FEB')
,('Preparation & Planning',3,'JV1',2,'FEB')
,('Preparation & Planning',4,'JV1',1,'FEB')
,('Preparation & Planning',1,'JV2',2,'FEB')
,('Preparation & Planning',2,'JV2',3,'FEB')
,('Preparation & Planning',3,'JV2',2,'FEB')
,('Preparation & Planning',4,'JV2',1,'FEB');

;WITH CTE AS(
SELECT 
    SubHeading_Name,Pointer_Id,[MONTH],
    SUM(case WHEN JV='JV1' THEN SCORE ELSE 0 END) AS  Score1,
    SUM(case WHEN JV='JV2' THEN SCORE ELSE 0 END) AS Score2
FROM #test GROUP BY SubHeading_Name,Pointer_Id,[MONTH]
)

SELECT * FROM (
     SELECT SubHeading_Name
           ,Pointer_Id
           ,[MONTH]
           ,CONCAT(CAST(Score1 AS VARCHAR(5)),' ',CAST(Score2 AS VARCHAR(5))) AS Score
      FROM CTE
               ) AS CTE1 

PIVOT(MAX(score) FOR [MONTH] IN([JAN],[FEB]))AS t1