2013-02-15 6 views
0

В приведенном ниже ниже ответе даются два результата, где все одинаково, за исключением последнего столбца v2_roles.id. Есть ли способ, чтобы сгруппировать их в одну колонку (может быть запятая seprated список) и получить только один результат обратноГруппировка результатов нескольких строк в одном столбце

SELECT v2_admin.adminid, 
     v2_admin.adminname, 
     v2_admin.login, 
     v2_admin.email, 
     v2_roles.id 
FROM v2_admin 
     INNER JOIN v2_admin_roles 
       ON v2_admin.adminid = v2_admin_roles.adminid 
     INNER JOIN v2_roles 
       ON v2_admin_roles.roleid = v2_roles.id 
WHERE v2_admin.adminid = 2 
+1

Какие RDBMS ....? – sgeddes

+0

Soory пропустил этот MSSQL 2008 – nasaa

+1

Предоставьте образцы данных и то, что вы хотите получить. –

ответ

1

Это также должно работать,

;WITH mytable AS (
    SELECT v2_admin.adminid, 
     v2_admin.adminname, 
     v2_admin.login, 
     v2_admin.email, 
     v2_roles.id 
    FROM v2_admin 
     INNER JOIN v2_admin_roles 
       ON v2_admin.adminid = v2_admin_roles.adminid 
     INNER JOIN v2_roles 
       ON v2_admin_roles.roleid = v2_roles.id 
    WHERE v2_admin.adminid = 2 
) 

SELECT t1.adminid,t1.adminname, t1.login, t1.email, 
     roleIds =REPLACE((SELECT convert(varchar,id) AS [data()] 
       FROM mytable t2 
       WHERE t2.adminid = t1.adminid 
       --ORDER BY t2.adminid 
       FOR XML PATH('') 
      ), ' ', ' , ') 
FROM mytable t1 
GROUP BY t1.adminid,t1.adminname, t1.login, t1.email ; 
+0

Спасибо. Это работает как ожидалось – nasaa

+0

Нет проблем! ..... – Kaf

1

Это небольшой трюк с использованием FOR XML для преобразования поля в список и STUFF, чтобы удалить начиная запятая - это должно быть близко (непроверенные):

SELECT v2_admin.adminid, 
     v2_admin.adminname, 
     v2_admin.login, 
     v2_admin.email, 
     STUFF(
     (
      SELECT ',' + CAST(v2_roles.id as varchar) AS [text()] 
       FROM v2_roles 
       WHERE v2_admin_roles.roleid = v2_roles.id 
      ORDER BY v2_roles.id 
      FOR XML PATH('') 
     ), 1, 1, '') AS Roles 
FROM v2_admin 
     INNER JOIN v2_admin_roles 
       ON v2_admin.adminid = v2_admin_roles.adminid 
WHERE v2_admin.adminid = 2 
GROUP BY v2_admin.adminid, 
     v2_admin.adminname, 
     v2_admin.login, 
     v2_admin.email 
+0

Спасибо за это, но он дает ошибку. Ошибка преобразования при преобразовании значения varchar ',' в тип данных int. – nasaa

+0

Создайте свои роли. Идет - один секунда, и я отредактирую ... – sgeddes

+0

@nasaa - см. Правки - вам просто нужно было наложить твой на варчар - удачи! – sgeddes

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