2013-03-14 3 views
2

У меня есть таблица, которая называется SectionNames следующимОбъединить два или более столбца динамически на основе столбцов таблицы?

SectionID SectionCode  Subsection 
    1   xYz   Individual 
    2   xYz   Family 
    3   CYD   Friends 
    4   PCPO  level1 
    5   PCPO  level2 
    6   PCPO  level3

так далее. Поэтому в будущем мы можем добавить один или несколько подразделов для каждого кода раздела.

И еще одна таблица, которая является справочной таблицей выше SectionNames Таблица и Employee таблица с данными о сотруднике.

ID EmployeeID SectionID Cost  
1   1    1 $200 
2   1    2 $300  
3   1    3 $40 
4   1    4 $10 
5   1    5 No Level 
6   1    6 No Level 
7   1    7 $20 
8   1    8 No Level 
9   1    9 No Level

Так Iwant из положить из этих таблиц должен выглядеть следующим образом:

EmployeeID  Individual_xyz_Cost Family_xyz_Cost Friends_xyz_cost level1_PCPO_cost level2_PCPO_Cost 
    1     $200     $300    $400    $10    NoLevel 

Есть несколько записей сотрудника существует в моей таблице сотрудников. И я хочу, чтобы это было динамично. Например, если в будущем, если для раздела XYZ добавлен еще один подраздел под названием Relatives, тогда мой запрос должен вернуть Relatives_XYZ_Cost.

Как я могу написать этот запрос динамически?

ответ

6

Вы должны использовать функцию PIVOT для преобразования данных из столбцов в строки. Если у вас будет неизвестное количество значений, которые должны быть столбцами, вам нужно будет использовать динамический SQL.

Сначала проще увидеть статическую или жестко кодированную версию, а затем преобразовать ее в динамическую SQL-версию. Статическая версия используется, когда у вас есть известное число значений:

select * 
from 
(
    select e.employeeid, 
    s.subsection +'_'+s.sectioncode+'_Cost' Section, 
    e.cost 
    from employee e 
    inner join sectionnames s 
    on e.sectionid = s.sectionid 
) src 
pivot 
(
    max(cost) 
    for section in (Individual_xYz_Cost, Family_xYz_Cost, 
        Friends_CYD_Cost, level1_PCPO_Cost, 
        level2_PCPO_Cost, level3_PCPO_Cost) 
) piv; 

См SQL Fiddle with Demo.

Если вам нужен запрос, чтобы быть гибким, то вы будете преобразовать это использовать динамический SQL:

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

select @cols = STUFF((SELECT ',' + QUOTENAME(subsection +'_'+sectioncode+'_Cost') 
        from SectionNames 
        group by subsection, sectioncode, sectionid 
        order by sectionid 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT employeeid,' + @cols + ' 
       from 
      (
       select e.employeeid, 
        s.subsection +''_''+s.sectioncode+''_Cost'' Section, 
        e.cost 
       from employee e 
       inner join sectionnames s 
        on e.sectionid = s.sectionid 
      ) x 
      pivot 
      (
       max(cost) 
       for section in (' + @cols + ') 
      ) p ' 

execute(@query) 

См SQL Fiddle with Demo

Результат как это:

| EMPLOYEEID | INDIVIDUAL_XYZ_COST | FAMILY_XYZ_COST | FRIENDS_CYD_COST | LEVEL1_PCPO_COST | LEVEL2_PCPO_COST | LEVEL3_PCPO_COST | 
---------------------------------------------------------------------------------------------------------------------------------- 
|   1 |    $200 |   $300 |    $40 |    $10 |   No Level |   No Level | 
+0

это работает как шарм ... Ты такой быстрый человек ... Спасибо большое. – user1882705

+0

Могу ли я использовать этот динамический результирующий набор следующим образом, чтобы присоединиться к какой-либо другой таблице: Inner Join (Result set) AS z ON z.ID = b.ID – user1882705

+0

@ user1882705 Да, вы можете просто расширить строку sql, чтобы поместить этот выбор в подзапрос – Taryn

Смежные вопросы