T-SQL - как поменять несколько строк на один столбец - PullRequest
1 голос
/ 12 октября 2011

У меня есть структура результирующего набора, подобная этой

code    Value
1       A0001
1       A0002
2       B0001
2       B0002
2       B0003
3       C0001
4       D0001
4       D0002
..       ...

, и я хочу перейти к следующему:

ID     Response
1       A0001, A0002
2       B0001, B0002, B0003
3       C0001
4       D0001, D0002
...       ...

с использованием SQL.Есть ли способ сделать это с помощью T-SQL?(и PL / SQL)

большое спасибо!


спасибо t-clausen.dk

Это работает.Но я хочу использовать один запрос (может быть с подзапросом).как я могу это сделать?

Ответы [ 3 ]

1 голос
/ 12 октября 2011

Это было написано для mssql и изменено на то, что я надеюсь, это синтаксис оракула Пожалуйста, дайте мне знать, если это работает.

declare @t table(code int, value varchar(20))
insert @t values(1,'A0001') 
insert @t values(1,'A0002') 
insert @t values(2,'B0001')
insert @t values(2,'B0002') 
insert @t values(2,'B0003') 
insert @t values(3,'C0001') 
insert @t values(4,'D0001') 
insert @t values(4,'D0002') 

;with a as
(select code, 
row_number() over (partition by code order by value) rna, 
row_number() over (partition by code order by value desc) rnd, 
value 
from @t
), b as
(
select code, rnd, value, rna, cast(value as varchar(2000)) outvalue from a where rna = 1
union all
select a.code, a.rnd, a.value, a.rna, cast(b.outvalue || ',' || a.value as varchar(2000))
from a 
join b on a.rna - 1 = b.rna and a.code = b.code
)
select code, outvalue from b
where rnd = 1
order by 1
--option (maxrecursion 0) -- not sure this is pl/sql
1 голос
/ 12 октября 2011

Для T-SQL я бы использовал что-то вроде этого:

;with sample_data AS
(
SELECT 1 as code,'A0001' as [value]
UNION ALL SELECT 1,'A0002'
UNION ALL SELECT 2,'B0001'
UNION ALL SELECT 2,'B0002'
UNION ALL SELECT 2,'B0003'
UNION ALL SELECT 3,'C0001'
UNION ALL SELECT 4,'D0001'
UNION ALL SELECT 4,'D0002'
)
SELECT
code
,STUFF((
    SELECT
      ', ' + sd2.[value]
    FROM sample_data sd2
    WHERE sd1.code = sd2.code
    FOR XML PATH('')
    ), 1, 1, ''
  )
FROM sample_data sd1
GROUP BY sd1.code

КАК для PL / SQL не знаю, боюсь!

0 голосов
/ 26 октября 2015

для PL / SQL

SELECT DISTINCT CODE as ID, LISTAGG(VALUE, ',')  
       WITHIN GROUP(ORDER BY code) OVER(PARTITION BY CODE) AS Response
       FROM TableName ORDER BY CODE;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...