сводные данные из одной таблицы - PullRequest
1 голос
/ 09 апреля 2019

таблица ввода

country tag short
UK  F1  Units
UK  F2  Volume
UK  F3  Value
FR  T3  Units
FR  T2  Volume
FR  T1  Value

вывод результата, который я хочу:

country Units Volume Value
uk      f1      f2      f3
fr      t1      t2      t3

Ответы [ 3 ]

1 голос
/ 09 апреля 2019

Для решения необходимо использовать динамическое вращение.

create table #temp
(
     country varchar(30),tag varchar(20),short varchar(300)
) 
insert into #temp values ('UK',  'F1',  'Units')
insert into #temp values ('UK',  'F2' , 'Volume')
insert into #temp values ('UK'  ,'F3', 'Value')
insert into #temp values ('FR',  'T3' , 'Units')
insert into #temp values ('FR' , 'T2',  'Volume')
insert into #temp values ('FR',  'T1' , 'Value')

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

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

set @query = 'SELECT country, ' + @cols + ' from 
            (
                select country
                    , tag
                    , short
                from #temp
           ) x
            pivot 
            (
                 max(tag)
                for short in (' + @cols + ')
            ) p '


execute(@query)

drop table #temp
1 голос
/ 09 апреля 2019

Если существует фиксированное количество различных коротких значений, просто используйте case выражения, чтобы выполнить условное агрегирование :

select country,
       max(case when short = 'Units' then tag end) as Units,
       max(case when short = 'Volume' then tag end) as Volume,
       max(case when short = 'Value' then tag end) as val
from tablename
group by country
0 голосов
/ 09 апреля 2019

Структура таблицы

 CREATE TABLE tablename
  (
     [country] [NVARCHAR](10) NULL,
     [tag]     [NVARCHAR](10) NULL,
     [short]   [NVARCHAR](10) NULL
  )

INSERT INTO tablename
VALUES      
('UK','F1','Units'),
('UK','F2','Volume'),
('UK','F3','Value'),
('FR','T3','Units'),
('FR','T2','Volume'),
('FR','T1','Value');

Использование функции Pivot

SELECT *
FROM   tablename
       PIVOT ( Max(tag)
             FOR short IN ([Units], [volume], [Value]) ) piv;  

Демонстрация в Интернете: Ссылка

Использование динамическогоSQL PIVOT

DECLARE @cols  AS NVARCHAR(max),
        @query AS NVARCHAR(max)

SELECT @cols = Stuff((SELECT distinct ',' + Quotename(short)
                      FROM   tablename
                      FOR xml path(''), type).value('.', 'NVARCHAR(MAX)'), 1, 1,'');

SET @query = 'SELECT * 
              FROM   tablename        
                     PIVOT ( Max(tag)              
                           FOR short IN (' + @cols + ') ) piv;';

EXECUTE(@query);  

Онлайн-демонстрация: Ссылка

Результат

+---------+-------+--------+-------+
| country | Units | volume | Value |
+---------+-------+--------+-------+
| FR      | T3    | T2     | T1    |
| UK      | F1    | F2     | F3    |
+---------+-------+--------+-------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...