vinodh muthusamy Ответов: 2

Как преобразовать строки в столбцы


Я хочу преобразовать строки в столбцы. вот мой образец таблицы.

tbl_table

Тип FId
6 Количество
8 наименование
15-я улица
18 Адрес

Вот вопрос, который я разработал.

SELECT SUBSTRING((SELECT ',' + CAST(FId AS VARCHAR) FROM tbl_table where Type in('Address','Street','Number','Name')FOR XML PATH('')), 2,10000) AS FID

Я получил вывод как

клин
6,8,15,18

Он был преобразован строками в столбцы, но моя проблема заключается в том, что,

Мне нужен выход в том же порядке, в каком вход я пропустил внутрь.

Мой ожидаемый результат должен быть следующим

клин
18,15,6,8


Пожалуйста, решите эту проблему.

Что я уже пробовал:

SELECT SUBSTRING((SELECT ',' + CAST(FId AS VARCHAR) FROM tbl_table where Type in('Address','Street','Number','Name')FOR XML PATH('')), 2,10000) AS FID

CHill60

Если я введу данные в таблицу в указанном Вами порядке, то получу ваши ожидаемые результаты "18,15,6,8".
Если вы заинтересованы в поддержании порядка ввода записей в таблицу, то вам нужно будет каким - то образом записать это-либо в столбец идентификаторов, либо в последовательность (SQL 2012 и более поздние версии)

2 Ответов

Рейтинг:
2

Richard Deeming

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

Попробуйте что-нибудь вроде этого:

SELECT STUFF(
    (SELECT ',' + CAST(FId As varchar(20)) 
    FROM tbl_table 
    WHERE [Type] IN ('Address', 'Street', 'Number', 'Name')
    ORDER BY CASE [Type] 
        WHEN 'Address' THEN 0 
        WHEN 'Street' THEN 1 
        WHEN 'Number' THEN 2 
        ELSE 3 
    END
    FOR XML PATH(''), TYPE).value('.', 'varchar(max)')
), 1, 1, '') AS FID

То STUFF функция[^] позволяет избежать необходимости предоставлять конечную точку для операции подстроки.

И добавления TYPE и .value('.', 'varchar(max)') гарантирует, что в выходных данных не будет никакого XML-кодированного текста, как описано в разделе эта простая разговорная статья[^].


Рейтинг:
0

shreyal acharya

Declare @products varchar(200)
set @products= 'Address,Street,Number,Name'
Declare @individual varchar(20)
Declare @count varchar(200)
set @count = ''
WHILE LEN(@products) > 0
BEGIN
    IF PATINDEX('%,%', @products) > 0
    BEGIN
        SET @individual = SUBSTRING(@products,
                                    0,
                                    PATINDEX('%,%', @products))
         
        SET @products = SUBSTRING(@products,
                                  LEN(@individual + ',') + 1,
                                  LEN(@products))
		select @count = @count + ' ' + convert(varchar,fid) from tbl_table where [type] =@individual
		
    END
    ELSE
    BEGIN
        SET @individual = @products
        SET @products = NULL
        select @count = @count + ' ' + convert(varchar,fid) from tbl_table where [type] =@individual
        select @count
    END
END


vinodh muthusamy

Параметр, который я дал, - это образец, но он будет больше 20 или 30. Все это динамично.

CHill60

Это возвращает "47" - не совсем то, что хотел ОП. Это также действительно ужасный вопрос.

vinodh muthusamy

Этот запрос добавляет все значения и выполняет запрос