2015-05-13 59 views
2

我的要求是将多行数据显示到单个单元格中。例如,我有一位专门从事多个主题的老师。如何将多行数据显示为逗号分隔的单个单元格

staffid Subjects 
------------------- 
13   Hindi 
13   asd 

我想导致以下格式

Hindi, asd 

STAFFID为13

要完成这个任务我用下面的代码

declare @output varchar(max) 
select @output = COALESCE(@output + ', ', '') + sr.title 
from streamsubjects sr 
join StaffSubjectAssociation ir on ir.StreamSubjectID=sr.StreamSubjectID 
where StaffId = 13 

select @output 

,从而获得所需的输出我创建了一个用户定义的标量函数,在下面给出

ALTER FUNCTION [dbo].[getSubjectsForStaff] 
    (
    @StaffId int 
    ) 
    RETURNS varchar 
    AS 
    BEGIN 

    declare @output varchar(max) 
    select @output = COALESCE(@output + ', ', '') + sr.title 
    from streamsubjects sr 
join StaffSubjectAssociation ir on ir.StreamSubjectID=sr.StreamSubjectID 
    where StaffId = @StaffId 

    RETURN @output 
END 

但是我没有得到想要的结果我只得到第一个字母的主题。任何人都可以告诉我为什么我没有在标量函数中使用相同的代码获得期望的结果。

什么才是正确的解决方案,取得成效? 请帮助我我是这项技术的新成员。

+0

其中R DBMS是为了这个?请添加一个标签来指定您是使用'mysql','postgresql','sql-server','oracle'还是'db2' - 或者其他的东西。 –

+1

问题出在函数的返回参数长度总是必须声明一个具有指定长度的Varchar变量。 –

+0

正如'Arun Gairola'已经提到的那样,你没有指定'varchar'的长度,所以默认'varchar'没有指定的长度只有30个字符,所以字符串将被截断为30个字符。 – Vasily

回答

1
另外

尝试此方法:

DECLARE @table TABLE(staffid INT, subject VARCHAR(30)) 
INSERT INTO @table 
VALUES 
(13,'Hindi'), 
(13,'English'), 
(14,'Japanese'), 
(14,'English') 

SELECT staffid, 
     STUFF(grp, 1, 1, '') 
FROM @table a 
     CROSS APPLY (SELECT ',' + subject 
        FROM @table b 
        WHERE a.staffid = b.staffid 
        FOR XML PATH('')) group_concat(grp) 
GROUP BY staffid,grp 
0

您的查询和功能似乎是完美的。你只需要给你的功能RETURN一个尺寸。

ALTER FUNCTION [dbo].[getSubjectsForStaff] 
    (
    @StaffId int 
    ) 
    RETURNS varchar(MAX) -- Add the size here 
    AS 
    BEGIN 

    declare @output varchar(max) 
    select @output = COALESCE(@output + ', ', '') + sr.title 
    from streamsubjects sr 
join StaffSubjectAssociation ir on ir.StreamSubjectID=sr.StreamSubjectID 
    where StaffId = @StaffId 

    RETURN @output 
    END 
0

相同@Deepak Pawar变体,但不cross apply

DECLARE @table TABLE 
    (
     staffid INT , 
     [subject] VARCHAR(30) 
    ) 
INSERT INTO @table 
VALUES (13, 'Hindi'), 
     (13, 'English'), 
     (14, 'Japanese'), 
     (14, 'English') 

SELECT DISTINCT 
     a.staffid , 
     SUBSTRING((SELECT ', ' + b.[subject] 
        FROM @table b 
        WHERE a.staffid = b.staffid 
        FOR 
        XML PATH('') 
       ), 3, 999) grp 
FROM @table a 

输出结果

enter image description here

相关问题