2015-04-02 9 views
0

Когда я использую оператор STUFF для объединения строк, он сортирует их в алфавитном порядке и численно, что заставляет значения переупорядочивать в нежелательном порядке. Как предотвратить это.Оператор SQL STUFF неправильный порядок

STUFF ((SELECT '; ' + t2.[film name] 
     FROM [filmbase].[dbo].[filmstowatch] t2 
     WHERE t1.[Mobile Number] = t2.[Mobile Number] 
     FOR XML PATH('')), 1,2,'') [film name], 

    STUFF ((SELECT '; ' + t2.[customer No] 
     FROM [filmbase].[dbo].[filmstowatch] t2 
     WHERE t1.[Mobile Number] = t2.[Mobile Number] 
     FOR XML PATH('')), 1,2,'') [customer no] 
FROM temp.dbo.Temptable t1 

Например,

Исходные данные:

Заказчик №: -1

Film Имя: - Fast & Furious

Номер мобильного телефона: - 123456789

Клиент №: -2

Film Имя: - 2 Fast 2 Furious

Номер мобильного телефона: - 123456789

Заказчик №: -3

Film Имя: - Fast & Furious Tokyo Drift

Номер мобильного телефона: - 123456789

Фактический выход:

Mobile Number:- 123456789, 
Film Name:- 2 Fast 2 Furious; Fast & Furious; Fast & Furious Tokyo Drift 
Customer No:- 1;2;3 

Желаемая Выход:

Mobile Number:- 123456789, 
Film Name:- 2 Fast 2 Furious; Fast & Furious; Fast & Furious Tokyo Drift 
Customer No:- 2;1;3 

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

Я думаю, код должен быть чем-то вроде

STUFF ((SELECT '; ' + t2.[film name] 
     FROM [filmbase].[dbo].[filmstowatch] t2 
     WHERE t1.[Mobile Number] = t2.[Mobile Number] 
order by film_name /* and then here should be something that matches film name to customer no??*/ 
     FOR XML PATH('')), 1,2,'') [film name], 

Чтобы получить 2F2F, е & F, F & FTD, 2,1,3 ВМЕСТО я получаю 2F2F, е & F, F & fTD, 1,2,3, чего я не хочу.

+0

Операция 'STUFF' не выполняет никаких переупорядочений. Если вы хотите, чтобы заказ добавлял 'order by' к вашим запросам' xml path'. –

+0

Я не уверен, знаете ли вы, что я хотел, но в основном после написания сценария я хотел вернуться в одну строку: номер мобильного телефона, имена фильмов и номер клиента. где имена фильмов и имена клиентов имеют свои значения: 2f2f = 2, f & f = 1, f & fTD = 3 ... вместо этого я получаю 2f2f = 1, f & f = 2, f & fTD = 3 –

ответ

1

Добавить order by в подзаголовок, чтобы получить требуемый заказ. Например, для случайного упорядочения:

STUFF((SELECT '; ' + t2.[film name] 
     FROM [filmbase].[dbo].[filmstowatch] t2 
     WHERE t1.[Mobile Number] = t2.[Mobile Number] 
     ORDER BY NEWID() 
     FOR XML PATH('') 
    ), 1, 2, '' 
    ) as [film name], 

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

+0

Я хотел показать, что 2 быстрых 2 яростных = 2 и fast & furious = 1 и быстрый и яростный tokyo drift = 3 –

+0

, но вместо этого сценарий разместил 2f2f, f & f, f & fTD с порядком 1; 2; 3, когда он должен быть 2f2f, f & f, f & fTD с порядком 2; 1; 3 –