我有一个SELECT查询,它返回同一记录的多行,因为在具有许多不同结果的字段上有一个分组,例如。
ID Name x
1 test a
1 test b
1 test c
如何创建一个在select语句中获取当前记录id并在一个字段中返回x的所有值的函数?
答案 0 :(得分:1)
没有好的基于方式的方法来做到这一点。您需要在结果集上使用游标或其他形式的迭代来将其连接到单个字段中。
你没有提到你的数据库服务器,如果它的sql server 2005或更高版本的pivot功能可以帮助你,我不是很流利使用它,但这里是一个链接
答案 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