2015-05-25 3 views
0

В запросе, как этот:SQL Server: Выберите несколько записей в одном операторе отбора

SELECT * 
FROM `Order` 
WHERE `CustID` = '1' 

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

| CustID| Order | 
----------------- 
| 1  | Order1| 
| 1  | Order2| 
| 1  | Order3| 
----------------- 

Как написать SQL заявление, чтобы получить в результате, как это одна ?:

| CustID| Order     | 
--------------------------------- 
| 1  | Order1, Order2, Order3| 
--------------------------------- 

в MYSQL это возможно с Group_Concat, но в SQL Server дает ERRO r, например, синтаксическая ошибка или некоторые.

+0

Возможный дубликат [Как сделать запрос с группой \ _concat в sql-сервере] (http://stackoverflow.com/questions/17591490/how-to-make-a-query-with-group-concat-in -sql-server) –

+1

Попробуйте googling «SQL Server group_concat». –

+0

http://stackoverflow.com/questions/194852/concatenate-many-rows-into-a-single-text-string – wiretext

ответ

6

Использование XML Path (see fiddle)

SELECT distinct custid, STUFF((SELECT ',' +[order] 
FROM table1 where custid = t.custid 
FOR XML PATH('')), 1, 1, '') 
FROM table1 t 
where t.custid = 1 

STUFF заменяет первое , с пустой строкой, то есть удаляет его. Вам нужен отдельный, иначе он будет соответствовать всем заказам, так как он находится на custid.

FOR XML
PATH Mode
STUFF

+0

Я вижу, что мы думали об одном и том же ... :-) –

+0

@ZoharPeled 1 минута слишком поздно :) Великие умы думают одинаково, поэтому hav e a 1+ :) – artm

+0

Просто отредактируйте свои ссылки, чтобы сделать его более читаемым, и у вас будет отличный ответ. все еще получил мой upvote :-) –

-1

попробуйте это. Измените имя таблицы и имена столбцов для того, что вам нужно;

SELECT custID, 
     LISTAGG(Order, ', ') WITHIN GROUP (ORDER BY Order) text 
    FROM table_name 
GROUP BY custID 

Редактировать для MSSQL. Вы должны использовать функцию group_concat.

SELECT custID, GROUP_CONCAT(Order) 
    FROM table_name 
WHERE CustID = 1 
GROUP BY custID; 
+0

Речь идет о 'SQL Server', там нет такой функции, как' LISTAGG'. – gotqn

+1

Опять же, в 'Microsoft SQL Server' нет функции' group_concat' :-) – gotqn

+0

sql сервер не имеет group_concat. –

4

Вы можете использовать функцию Stuff и For xml пункт так:

SELECT DISTINCT CustId, STUFF((
    SELECT ','+ [Order] 
    FROM [Order] T2 
    WHERE T2.CustId = T1.CustId 
    FOR XML PATH('') 
), 1, 1, '') 
FROM [Order] T1 

fiddle here

Примечание: Использование order в качестве имени таблицы или имени столбца - очень и очень плохая идея. Существует причина, по которой они называли зарезервированные слова зарезервированы.
См. this link для моего любимого способа избежать таких вещей.

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