Поменять местами строку и столбец - PullRequest
1 голос
/ 23 октября 2019

Я поделился примером запроса и ожидаемым результатом. Мой запрашиваемый результат выглядит как

enter image description here

Запрос для этого

select *
into #res
from (
  select 'B1' branch,123 amount,2 count,1234 Total
  union all
  select 'B2' branch,523 amount,23 count,123 Total
  union all
  select 'B3' branch,666 amount,9 count,652 Total
  union all
  select 'B4' branch,234 amount,12 count,256 Total
) res

select * from #res

Ожидаемый результат Image

enter image description here

Я пытался использовать pivot, но не получил.

1 Ответ

1 голос
/ 23 октября 2019

, если только ваш branch является динамическим, вы можете объединить amount, count and total.

select * into #res from (
    select 'B1' branch,123 amount,2 count,1234 Total
    union all
    select 'B2' branch,523 amount,23 count,123 Total
    union all
    select 'B3' branch,666 amount,9 count,652 Total
    union all
    select 'B4' branch,234 amount,12 count,256 Total
    union all
    select 'B5' branch,233 amount,12 count,256 Total
)res


declare  @cols nvarchar(max);

declare  @sql nvarchar(max);

select @cols =
    stuff((select N'],[' + branch
       from (select branch
          from #res) AS t1   
       for xml path('')
    ), 1, 2, '') + N']';


set @sql = N'Select ''desc'' as [desc], ' + @cols + N'
            from (select branch from #res)t1 
            pivot 
            (
                max(t1.branch)
                for t1.branch in (' + @cols + N')
            ) p
            union all
            Select ''amount'' as [desc], ' + @cols + N'
            from (select cast(amount as varchar(30)) as amount, branch from #res)t1 
            pivot 
            (
                max(t1.amount)
                for t1.branch in (' + @cols + N')
            ) p
            union all
            Select ''count'' , ' + @cols + N'
            from (select cast([count] as varchar(30)) as [count], branch from #res)t1 
            pivot 
            (
                max(t1.[count])
                for t1.branch in (' + @cols + N')
            ) p
            union all
            Select ''Total'' , ' + @cols + N'
            from (select cast([Total] as varchar(30)) as [Total], branch from #res)t1 
            pivot 
            (
                max(t1.[Total])
                for t1.branch in (' + @cols + N')
            ) p
            '

print @sql;
exec sp_executesql @sql;

drop table #res
...