使用函数格式化SQL查询

时间:2009-10-08 14:54:49

标签: sql function

我有一个SELECT查询,它返回同一记录的多行,因为在具有许多不同结果的字段上有一个分组,例如。

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

如何创建一个在select语句中获取当前记录id并在一个字段中返回x的所有值的函数?

4 个答案:

答案 0 :(得分:1)

没有好的基于方式的方法来做到这一点。您需要在结果集上使用游标或其他形式的迭代来将其连接到单个字段中。

你没有提到你的数据库服务器,如果它的sql server 2005或更高版本的pivot功能可以帮助你,我不是很流利使用它,但这里是一个链接

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

答案 1 :(得分:0)

创建一个这样的函数:

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

答案 2 :(得分:0)

看到这个。使用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

答案 3 :(得分:0)

在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