2015-05-13 101 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

相關問題