Показать значение определенного столбца в качестве заголовка в SQL Server - PullRequest
0 голосов
/ 06 ноября 2018

Я создаю веб-приложение, в котором у меня есть требование, в котором я хочу отображать значение столбца в качестве заголовка

Пример

SELECT Name, Leave
FROM tblUser 
INNER JOIN tblLeaveMaster ON tblUser.EmployeeID = tblLeaveMaster.EmployeeID

Из этого запроса я получаю следующие результаты:

Name     Leave
---------------
Test1       5
Test2      10
test3       2

Теперь я хочу получить эти значения как

Test1 Test2 Test3
-----------------
  5     10    2

Как мне этого добиться?

Ответы [ 4 ]

0 голосов
/ 06 ноября 2018

Вы можете найти свой результат по запросу, как показано ниже. Здесь я взял вывод вашего запроса во временную таблицу.

Create table #finalData(ColName Varchar(30), Leave INT)
INSERT INTO #finalData Values('Test1', 5),('Test2', 10),('Test3', 2)

DECLARE @cols AS NVARCHAR(MAX),  
    @query  AS NVARCHAR(MAX);  

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.ColName)   
            FROM #finalData c  
            FOR XML PATH(''), TYPE  
            ).value('.', 'NVARCHAR(MAX)')   
        ,1,1,'')  

set @query = 'SELECT ' + @cols + ' from   
            (  
                select ColName  
                    , Leave  
                from #finalData  
           ) x  
            pivot   
            (  
                 max(Leave)  
                for ColName in (' + @cols + ')  
            ) p '  

execute(@query)  
DROP TABLE #finalData

Надеюсь, это поможет вам. Вывод, как показано ниже

Test1   Test2   Test3
5       10      2
0 голосов
/ 06 ноября 2018

Вы можете попробовать использовать pivot

select pv.* from
(SELECT Name,Leave
FROM tblUser INNER JOIN tblLeaveMaster ON tblUser.EmployeeID=tblLeaveMaster.EmployeeID
)X
pivot
(max(leave) for name in ([Test1],[Test2],[Test3])) as pv

Для динамического PIVOT

declare @sql varchar(max)='',@col_list varchar(8000)=''

set @col_list = (select distinct quotename([Name])+',' from (SELECT Name,Leave
    FROM tblUser INNER JOIN tblLeaveMaster ON tblUser.EmployeeID=tblLeaveMaster.EmployeeID
    )X
for xml path(''))

set @col_list = left (@col_list,len(@col_list)-1)

set @sql = 'select '+@col_list+' from
    (SELECT Name,Leave
    FROM tblUser INNER JOIN tblLeaveMaster ON tblUser.EmployeeID=tblLeaveMaster.EmployeeID
    )X
pivot (max([Leave]) for [Name] in ('+@col_list+'))pv'

exec(@sql)
0 голосов
/ 06 ноября 2018

попробуйте использовать случай, когда

select max( case when name='Test1' then Leave end) as test1,
max( case when name='Test2' then Leave end) as test2,
max( case when name='Test3' then Leave end) as test3 from 
tblUser INNER JOIN tblLeaveMaster
ON tblUser.EmployeeID=tblLeaveMaster.EmployeeID
0 голосов
/ 06 ноября 2018

Вы можете попробовать использовать функцию агрегирования условий. CASE WHEN с MAX или MIN

SELECT 
    MAX(CASE WHEN Name = 'Test1' THEN Leave END) Test1,
    MAX(CASE WHEN Name = 'Test2' THEN Leave END) Test2,
    MAX(CASE WHEN Name = 'Test3' THEN Leave END) Test3
FROM tblUser 
INNER JOIN tblLeaveMaster ON tblUser.EmployeeID=tblLeaveMaster.EmployeeID

EDIT

Если ваш столбец хочет создать динамический, вы можете попробовать использовать Динамический PIVOT

создайте свой оператор SQL и сделайте функцию агрегирования условий с помощью строки SQL подключения. затем используйте выполнить его динамически.

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX);

SET @cols = STUFF((SELECT distinct ', MAX(CASE WHEN Name = ''' + Name+''' THEN Leave END) ' + QUOTENAME(Name) 
            FROM tblUser 
            INNER JOIN tblLeaveMaster ON tblUser.EmployeeID=tblLeaveMaster.EmployeeID
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

SET  @query= 'SELECT '+ @cols+'
FROM tblUser 
INNER JOIN tblLeaveMaster ON tblUser.EmployeeID=tblLeaveMaster.EmployeeID'

execute(@query)

sqlfiddle

...