Функция кросс-таблицы SQL - PullRequest
0 голосов
/ 19 марта 2012

Привет, дорогие все мои друзья,

Я хочу спросить кое-что о функции перекрестных таблиц SQL. В настоящее время я использую экспресс-версию SQL 2008, и моя структура таблиц выглядит следующим образом.

UserID     Str_Value
1             A
1             B
1             C
2             A
2             B
3             D
3             E

Я хочу получить вот так.

UserID     Str_Value
1             A,B,C
2             A,B
3             D,E

Я не хочу использовать курсор. Есть ли какая-нибудь функция для этого?
Пожалуйста, дайте мне правильный путь. Я действительно ценю это.

Спасибо.

С наилучшими пожеланиями,

Chong

Ответы [ 4 ]

3 голосов
/ 19 марта 2012

Надеюсь, это поможет. Вы можете прокомментировать ORDER BY T1.Str_Value, если не нужно, и установить размер nvarchar (500), как требуется

SELECT DISTINCT T1.UserId,
Stuff(
      (SELECT N', ' + T2.Str_Value 
       FROM t T2
       WHERE T2.userId = T1.userid
       ORDER BY T2.Str_Value
       FOR XML PATH(''),TYPE).value('text()[1]','nvarchar(500)'),1,2,N'') 
        AS Str_Value
FROM t T1
3 голосов
/ 19 марта 2012
SELECT UserId, LEFT(Str_Value, LEN(Str_Value) - 1) AS Str_Value
FROM YourTable AS extern
CROSS APPLY
(
    SELECT Str_Value + ','
    FROM YourTable AS intern
    WHERE extern.UserId = intern.UserId
    FOR XML PATH('')
) pre_trimmed (Str_Value)
GROUP BY UserId, Str_Value
1 голос
/ 19 марта 2012

Попробуйте это:

SELECT DISTINCT
    t1.UserID,
    Values = SUBSTRING((SELECT ( ', ' + t2.Str_Value)
                   FROM dbo.Users t2

                   ORDER BY 
                      t2.Str_Value
                   FOR XML PATH( '' )
                  ), 3, 4000 )FROM  dbo.Users  t1
GROUP BY t1.UserID
0 голосов
/ 19 марта 2012
create table #temp
(
    userid int,
    str_value varchar(1)
)

insert into #temp values (1, 'A')
insert into #temp values (1, 'B')
insert into #temp values (1, 'C')

insert into #temp values (2, 'A')
insert into #temp values (2, 'B')

insert into #temp values (3, 'D')
insert into #temp values (3, 'E')

select userid, left(x.str_value, len(x.str_value) -1) as str_value
from #temp t
cross apply
(
    select str_value + ','
    FROM #temp t1
    where t.userid = t1.userid
    for xml path('')
) x (str_value)
group by userid, x.str_value

drop table #temp
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...