Ответ 1
Попробуйте:
select ID, [Name],
(select OrderID+',' from OrderTable where CustID=ID
group by OrderID for xml path('')) AS ListOfOrders
From CustomerTable
Customer Table -------------- ID Name 1 James 2 Peter
Order Table --------------- OrderId CustId 100 1 101 1 102 2
Как я могу написать запрос, который возвращает что-то вроде этого
ID,Name,ListofOrders 1,James,"100,101" 2,Peter,"102"
В Sybase у меня была функция LIST, которую я мог бы использовать, но я не нашел подобную функцию в SQL SERVER
Попробуйте:
select ID, [Name],
(select OrderID+',' from OrderTable where CustID=ID
group by OrderID for xml path('')) AS ListOfOrders
From CustomerTable
Создайте пользовательскую функцию, как показано ниже
CREATE FUNCTION [dbo].[CommaSeperatedOrderIDs](@CustId INT) returns varchar(Max)
AS
BEGIN
DECLARE @CommaSeperatedValues VARCHAR(MAX)
SELECT @CommaSeperatedValues = COALESCE(@CommaSeperatedValues+',' , '') + OrderID
FROM OrderTable WHERE CustId = @CustId
RETURN @CommaSeperatedValues
END
И затем,
select ID, [Name], ([dbo].[CommaSeperatedOrderIDs](ID)) AS ListofOrders
From CustomerTable
Очень простое и удобное решение, приведенное по ссылке ниже.
SQL-запрос, написанный на этой ссылке, находится в изображении... поэтому я не смог его скопировать.
Добавление полной информации из шейх Харис ссылка.
С учетом этой таблицы:
Чтобы получить вывод, например:
Используйте следующий SQL:
SELECT field1,
Substring(convert(varchar(100),
(
SELECT (', ' + field2)
FROM #test t2
WHERE t1.field1 = t2.field1
ORDER BY field1, field2
FOR XML PATH( '' )
)), 3, 1000 )
FROM #test t1
GROUP BY field1
Я добавил функцию преобразования в подстроку, чтобы поле WIDEMEMO отображалось (SQL Server)