2015-01-27 2 views
0

У меня есть две таблицы 1. #SetValuesTable 2. #labelTempTabCross применяются наряду с дополнительными столбцами

данных в #SetValuesTable выглядеть следующим образом:

MNUM  la1 la2  la3 la4 PropertyType 
12   1  0  2    s 
13   4  0  5  7  p 

данных в #labelTempTab выглядеть следующим образом:

RowNum Label Title PropertyType 
1  la1 Agent1 s 
2  la2 Agent2 s 
3  la3 Agent3 s 
4  la1 Agent1 p 
5  la2 Agent2 p 
6  la3 Agent3 p 
7  la4 Agent4 p 

Мне нужна таблица результатов следующим образом:

MNUM LabelName LabelValue PropertyType 
12 la1  1    s 
12 la2  0    s 
12 la3  2    s 
13 la1  4    p 
13 la2  0    p 
13 la3  5    p 
13 la4  7    p 

Запрос:

SELECT MNUM, LabelName , LabelValue FROM #SetValuesTable 
    CROSS APPLY (VALUES ' 
    stuff((SELECT ',('''+ replace(C.label,'''','"') + ''',' + quotename(C.label) + ')' FROM #labelTempTab c group by label FOR xml path('')), 1, 1, '') 
     ) AS UPTab (Label , LabelValue); 

Этот запрос приведет к:

MNUM LabelName LabelValue  
12 la1  1    
12 la2  0    
12 la3  2    
13 la1  4    
13 la2  0    
13 la3  5    
13 la4  7 

Может некоторые тела мне помочь, чтобы получить остальные столбцы также.

Примечание. Я попытался открепить таблицу, используя UNPIVOT, но производительность не очень хорошая. С перекрестным применением производительность действительно хорошая.

+0

Почему вы используете динамический SQL? –

+0

Гордон, который я написал, только часть более крупного. Решение для обычного SQL также будет работать для меня. изменен вопрос. – BumbleBee

+0

Вы сказали, что у вас есть 500 + столбцов, но я могу подсчитать только 10 столбцов в обеих таблицах. Где остальные? – Aducci

ответ

0

Вы можете сделать это с join:

select st.MNUM, lt.LabelName, 
     (case when lt.LabelName = 'la1' then la1 
      when lt.LabelName = 'la2' then la2 
      when lt.LabelName = 'la3' then la3 
      when lt.LabelName = 'la4' then la4  
     end) as LabelValue, 
     st.PropertyType 
from #labelTempTab lt join 
    #SetValuesTable st 
    on st.mnum = lt.label 
+0

Пробовал делать с соединением, но из-за огромного объема данных производительность очень медленная. Кроме того, таблица содержит минус 500+ столбцов, если мне нужно использовать случай, тогда запрос будет очень обширным. – BumbleBee

+0

Как быстро это нужно выполнить? Каждый раз, когда вы манипулируете «огромным количеством данных», это займет некоторое время. На мои деньги я все еще думаю, что ваш лучший выбор - это нелюд. – Xedni

+0

С UNPIVOT теперь он занимает около 90 секунд. – BumbleBee

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

  • Нет связанных вопросов^_^