2013-06-14 3 views
2

Вот часть моей таблицы MSSQL 2008 [ERROR CODE], которую я хочу перенести в следующую структуру. Я попытался найти обходной путь, но не смог найти решение для выполнения задачи. Использование Pivot Я думаю, что это невозможно, поскольку я не могу использовать функцию агрегата. Может кто-то, пожалуйста, помогите мне, как сделать это возможным?Pivot без агрегатной функции в MSSQL 2008 R2

+----------+-------+---------------------------------------------------+ 
| SKILL ID | SKILL |      PARAMETER      | 
+----------+-------+---------------------------------------------------+ 
|  1 | 121 | STANDARD VERBIAGE & PROCEDURES     | 
|  1 | 121 | ISSUE IDENTIFICATION        | 
|  1 | 121 | CALL COURTESY          | 
|  1 | 121 | ISSUE RESOLUTION         | 
|  2 | BO | COLLECTION PROCESS ADHERENCE      | 
|  2 | BO | INTELLIGENCE PARAMETER       | 
|  3 | EM | SOFT SKILLS          | 
|  3 | EM | PRODUCT KNOWLEDGE         | 
|  3 | EM | CALL CLOSING          | 
|  3 | EM | CALL OPENING          | 
|  4 | FLC | RESOLUTION          | 
|  4 | FLC | NONE            | 
|  5 | FTA | OTHERS           | 
|  5 | FTA | HYGIENE FACTORS         | 
|  5 | FTA | ACCOUNT SCREEN         | 
|  5 | FTA | ORDER , DOCUMENTATION AND CONFIGURATION   | 
|  5 | FTA | VALIDATION SCREEN         | 
|  5 | FTA | PARTY SCREEN          | 
|  5 | FTA | ORDER , DOCUMENTATION AND CONFIGURATION   | 
|  6 | NCE | COMPLIANCE          | 
|  6 | NCE | CRM            | 
|  6 | NCE | ACCOUNT LEVEL /INSTALLATION DETAILS CONFIRTMATION | 
|  6 | NCE | CONTENTS/BILL DETAILS        | 
|  6 | NCE | SELFCARE           | 
|  6 | NCE | FEEDBACK/SATISFACTION        | 
|  6 | NCE | OBJECTION RESOLUTION        | 
|  6 | NCE | CUSTOMER HANDLING         | 
|  6 | NCE | RED ALERT           | 
|  7 | RTO | ZERO TOLERANCE         | 
|  7 | RTO | OVERALL IMPRESSION        | 
|  7 | RTO | SUMMARY AND CLOSING        | 
|  7 | RTO | PROCESS KNOWLEDGE         | 
|  7 | RTO | OPENING           | 
|  8 | SHMNP | SKILL AREA          | 
|  8 | SHMNP | CONVINCING SKILLS         | 
+----------+-------+---------------------------------------------------+ 

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

+-------+--------------------------------+------------------------+---------------------------------------------------+ 
| SKILL |   PARAMETER1   |  PARAMETER2  | PARAMETER3          | 
+-------+--------------------------------+------------------------+---------------------------------------------------+ 
| 121 | STANDARD VERBIAGE & PROCEDURES | ISSUE IDENTIFICATION | CALL COURTESY          | 
| BO | COLLECTION PROCESS ADHERENCE | INTELLIGENCE PARAMETER | NULL            | 
| EM | SOFT SKILLS     | PRODUCT KNOWLEDGE  | CALL CLOSING          | 
| FLC | RESOLUTION      | NONE     | NULL            | 
| FTA | OTHERS       | HYGIENE FACTORS  | ACCOUNT SCREEN         | 
| NCE | COMPLIANCE      | CRM     | ACCOUNT LEVEL /INSTALLATION DETAILS CONFIRTMATION | 
| RTO | ZERO TOLERANCE     | OVERALL IMPRESSION  | SUMMARY AND CLOSING        | 
| SHMNP | SKILL AREA      | CONVINCING SKILLS  | NULL            | 
+-------+--------------------------------+------------------------+---------------------------------------------------+ 

ответ

11

Вы можете использовать функцию PIVOT, чтобы получить результат, вы просто должны использовать row_number(), чтобы помочь.

Базовый запрос для этого будет:

select skill_id, skill, parameter, 
    row_number() over(partition by skill, skill_id order by skill_id) rn 
from yt; 

См SQL Fiddle with Demo. Я использую row_number(), чтобы применить отдельное значение к каждой строке в пределах skill и skill_id, после чего вы будете использовать это значение номера строки в качестве столбца для PIVOT.

Полный код с PIVOT прикладной будет:

select skill_id, skill,[Parameter_1], [Parameter_2], [Parameter_3] 
from 
(
    select skill_id, skill, parameter, 
    'Parameter_'+cast(row_number() over(partition by skill, skill_id 
            order by skill_id) as varchar(10)) rn 
    from yt 
) d 
pivot 
(
    max(parameter) 
    for rn in ([Parameter_1], [Parameter_2], [Parameter_3]) 
) piv; 

См SQL Fiddle with Demo.

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

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME('Parameter_' 
          +cast(row_number() over(partition by skill, skill_id 
           order by skill_id) as varchar(10))) 
        from yt 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT skill_id, skill,' + @cols + ' from 
      (
       select skill_id, skill, parameter, 
        ''Parameter_''+cast(row_number() over(partition by skill, skill_id 
            order by skill_id) as varchar(10)) rn 
       from yt 
      ) x 
      pivot 
      (
       max(parameter) 
       for rn in (' + @cols + ') 
      ) p ' 

execute(@query); 

См SQL Fiddle with Demo

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