2011-01-10 4 views
0

У меня есть таблицаCSV в SqlServer 2005

колонки: Имя, Role, DEPT

Человек может иметь много ролей. Поэтому, получая данные, я хочу, чтобы столбец ролей находился в CSV, если у человека более одной роли.

Name Role   Dept 
jose Role1,Role2 PWD 

Предполагая, что все остальные детали, за исключением ролей для записей, являются такими же.

Благодаря

ответ

1

Это будет делать трюк для вас.

select 
    t3.Name, 
    left(t3.Roles, len(t3.Roles)-1) as Roles, 
    t3.Dept 
from 
    (select 
      t2.Name, 
      t2.Dept, 
      (select t1.[Role] + ',' 
      from Table1 as t1 
      where 
       t1.Name = t2.Name and 
       t1.Dept = t2.Dept 
      order by t1.[Role] 
      for xml path('')) as Roles 
     from Table1 as t2 
     group by t2.Name, t2.Dept) as t3 

Это взято из первого примера в «Методы, BLACKBOX XML» с этой страницы https://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/

Внутренний запрос создает список ролей в качестве XML. Параметр xml path ('') пуст, и поэтому вы не получаете разметку xml, а только список, разделенный запятыми.

Внешний запрос доступен только для удаления запятой в конце каждой строки.

Group by t2.Name, t2.Dept гарантирует, что вы получите только одну строку для каждой уникальной комбинации Name + Dept.

0

Вы можете создать определенную пользователем агрегатную функцию, которая производит разделенный запятыми список значений и могут быть использованы в запросах, как и любой другой агрегатной функции (т.е. MIN, MAX, SUM и т.д.) ,

Вот соответствующая запись из моего блога: A SQL CLR user-defined aggregate - notes on creating and debugging

После создания функции dbo.Concat, вы будете в состоянии выполнить следующий запрос:

SELECT 
    Name 
, Dept 
, dbo.Concat(Role) AS Roles 
FROM dbo.Table_1 
GROUP BY 
    Name 
, Dept 

Я использовал его в производственной среде для несколько лет, и его производительность действительно хороша даже при большом количестве обработанных строк.

0

Один из вариантов - сделать это с помощью рекурсивного параметра и курсора. Попробуйте с этим запросом:

DECLARE @Name varchar(50), @Role varchar(MAX), @Dept varchar(50) 

DECLARE role_cursor CURSOR FOR 
SELECT Name,min(Dept) 
FROM [dbo].[Table_1] 
group by Name 

OPEN role_cursor; 
FETCH NEXT FROM role_cursor 
INTO @Name, @Dept 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    set  @Role = '' 
    select @Role = @Role+[Role]+',' 
    FROM [dbo].[Table_1] 
    where [email protected] 

    select @Name,left(@Role,len(@Role)-1),@Dept 

    FETCH NEXT FROM role_cursor 
    INTO @Name, @Dept 
END 
CLOSE role_cursor; 
DEALLOCATE role_cursor; 

После того как вы его, вы можете использовать вставку до выбора для вставки значений в таблице результатов

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