2011-12-19 3 views
0

Можно создать дубликат:
dynamic sql pivot in sql serverГруппировка данных по столбцам

У меня есть таблица под названием Col_values ​​и Col_ID является полем идентификации данных выглядит следующим образом:

Val_ID  Col_ID  Value 
76951792  3   Closed 
76951791  3   Closed 
76951790  25   Open 
76951789  25   Closed 
76951792  1   US 
76951791  1   Canada 

и другая таблица называется Et_Col, и данные выглядят так:

Col_ID Col_Name D_ID 
3  Status  1 
25  Status  2 
1  Country 1 

Я хочу, чтобы выход как:

Val_ID  Status Country 
76951792 Closed  US 
76951791 Closed  Canada 
76951790 Open  Null 
76951789 Closed  Null 

Так что я написал курсор, чтобы получить выход и курсор возвращает заявление, как:

Select val_ID 
    ,max(case when Col_ID = 3 then Value end) as Status 
    ,max(case when Col_ID = 25 then Value end) as Status 
    ,max(CASE WHEN Col_ID = 1 THEN VALUE END) AS Country 
    From Col_values 
    Group by Val_ID 

это дает мне выход, как:

Val_ID Status Status Country 
76951792 Closed Null  US 
76951791 Closed Null  Canada 
76951789 Null  Closed Null 
76951790 Null  Open  Null 

Как это исправить?

+0

Вы знаете термин нормализация? –

+0

Это можно сделать с помощью динамической сводной таблицы: http://stackoverflow.com/questions/8327261/dynamic-sql-pivot-in-sql-server – JeffO

ответ

1

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

select 
    val_id 
    ,max(case when Col_name = 'Status' then Value end) as Status 
    ,max(case when Col_name = 'Country' then Value end) as Country 
from 
    col_values v 
    join ET_Col c on v.col_id=c.col_id 

group by val_id 

Различная что вы используете col_name разделить между колоннами вместо col_id, так удвоился имена столбцов будут слиты.

+0

Я просто дал вам некоторые образцы данных, но есть около 100 Col_ID. Поэтому я не могу написать SQl, поэтому я написал курсор, который дает мне инструкцию select, которую я написал выше – peter

+0

Я обновил. Я думаю, что вы сможете генерировать sql выше достаточно легко, основываясь на том, что вы уже можете сгенерировать. –

1
select val_id, value as Status 
from col_values 

Это то, что принесет желаемый результат. Почему, по-вашему, вам нужно группировать данные, чтобы получить это?

+0

См. Мой отредактированный вопрос. Я поместил еще несколько данных образца в таблицы. Чтобы вы могли понять, почему я группирую данные – peter

+0

Pivot - ключевое слово, которое вы ищете: Очень похоже на http://stackoverflow.com/questions/1677645/using-pivot-in-sql-server-2008 – xQbert

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