Отформатируйте SQL-запрос, используя функцию - PullRequest
2 голосов
/ 08 октября 2009

У меня есть запрос SELECT, который возвращает несколько строк для одной и той же записи из-за группировки по полю, которое имеет много разных результатов, например,

ID   Name    x
1    test    a
1    test    b
1    test    c

Как мне создать функцию, которая берет идентификатор текущей записи в операторе выбора и возвращает все значения x в одном поле?

Ответы [ 4 ]

1 голос
/ 08 октября 2009

Нет хорошего способа, основанного на множестве, чтобы сделать это. Вам нужно будет использовать курсор или другую форму итерации для набора результатов, чтобы объединить его в одно поле.

Вы не упомянули свой сервер базы данных, если его SQL Server 2005 или выше, может помочь вам функция pivot, я не очень свободно его использую, но вот ссылка

http://msdn.microsoft.com/en-us/library/ms177410.aspx

0 голосов
/ 09 октября 2009

В SQL Server создайте функцию

CREATE FUNCTION [dbo].[GetX]
(
   @id    INT
)
RETURNS NVARCHAR(1024)
AS
BEGIN
    DECLARE @AllInX NVARCHAR(1024)

    SELECT @AllInX = ISNULL(@AllInX + ', ', '')  + LTRIM(RTRIM(X))
      FROM NamesAndX
     WHERE ID = @id

    RETURN @AllInX
    END

И ваш запрос будет

SELECT ID
 , Name
 , dbo.GetX(ID)
FROM Names
0 голосов
/ 09 октября 2009

Смотрите это. Использует XML Path, должен работать в 2000/2005/2008, может быть устаревшим в 2010

set nocount on;
declare @t table (id int, name varchar(20), x char(1))
insert into @t (id, name, x)
select 1,'test1', 'a' union
select 1,'test1', 'b' union
select 1,'test1', 'c' union
select 2,'test2', 'a' union
select 2,'test2', 'c' union
select 3,'test3', 'b' union
select 3,'test3', 'c' 

SELECT p1.id, p1.name,
          stuff((SELECT ', ' + x
              FROM @t p2
             WHERE p2.id  = p1.id
             ORDER BY name, x
               FOR XML PATH('') ), 1,2, '') AS p3
      FROM @t p1
     GROUP BY 
        id, name

Возвращает

1   test1   a, b, c
2   test2   a, c
3   test3   b, c
0 голосов
/ 09 октября 2009

Создайте функцию, подобную этой:

CREATE FUNCTION GetValues (@id INT) RETURNS NVARCHAR(1000) AS
BEGIN 
  DECLARE mycursor
  CURSOR READ_ONLY
  FOR SELECT x
  FROM MyTable
  WHERE id = @id

  DECLARE @x NVARCHAR(100)
  DECLARE @return_value NVARCHAR(1000)

  SET @return_value = ''
  OPEN mycursor
  FETCH NEXT FROM mycursor INTO @x
  WHILE @@fetch_status = 0
  BEGIN
    SET @return_value = @return_value + @x
    FETCH NEXT FROM mycursor INTO @x
    IF (@@fetch_status = 0) SET @return_value = @return_value + ', '
  END
  CLOSE mycursor
  DEALLOCATE mycursor
  RETURN @return_value
END;

Ваш запрос будет:

SELECT id, GetValues(id) as x
FROM MyTable
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...