2010-12-07 39 views
0

我有一個查詢返回下面的輸出。如何讓行數據逗號在SQL中分開?

(否所有時間結果未相同的,有時是指它給第3類,有時8類別等)

類別名稱

  • 測試1
  • 的Test2
  • Test3的

現在我想要存儲過程應該以逗號分隔格式返回我這些日期。 例如輸出字符串應該是這樣的:Test1,Test2,Test3

你能告訴我如何實現這個?

+1

的可能重複[ SQL Server:我可以逗號分隔多行到一列?](http://stackoverflow.com/questions/2046037/sql-server-ca n-i-comma-delimit-multiple-rows-into-one-column) – 2010-12-07 18:39:06

+0

你爲什麼要在服務器端而不是在客戶端應用程序中執行此操作? – Juliet 2010-12-07 18:39:33

回答

1

嘗試COALESCEISNULL

DECLARE @returnValue varchar(MAX) 

SELECT 
    @returnValue = COALESCE(@returnValue + ', ', '') + CategoryName 
FROM 
    TableName 
+0

如果CategoryName可以爲null,則不會說OP。但是,在查詢中,您可能希望在CategoryName周圍添加COALESCE或ISNULL以防止NULL消除整個字符串。這是一個很好的習慣(串聯字符串時避免使用NULL),這可以防止稍後進行棘手的盲目調試。 – 2010-12-07 18:51:30

0

看一看像(全部工作示例

DECLARE @Table TABLE(
     ID INT, 
     Val VARCHAR(50) 
) 
INSERT INTO @Table (ID,Val) SELECT 1, 'A' 
INSERT INTO @Table (ID,Val) SELECT 1, 'B' 
INSERT INTO @Table (ID,Val) SELECT 1, 'C' 
INSERT INTO @Table (ID,Val) SELECT 2, 'B' 
INSERT INTO @Table (ID,Val) SELECT 2, 'C' 

--Concat 
SELECT t.ID, 
     STUFF((
       SELECT ',' + t1.Val 
       FROM @Table AS t1 
       WHERE t1.ID = t.ID 
       FOR XML PATH('') 
       ), 1, 1, '') 
FROM @Table t 
GROUP BY t.ID 

此外,你可能會發現,谷歌搜索會提供很多答案。

+0

如果你的數據包含如'<` or `>`或`&`等常見字符,那麼這將不起作用。 – 2010-12-07 18:43:09

0

一指:

SELECT STUFF((
    SELECT ',' + CategoryName AS [text()] 
    FROM YourTable 
    FOR XML PATH('') 
), 1, 1, '') 

...但要小心,將被轉義了XML實體 - 例如& => &amp;

5

這會爲您的數據中的所有字符的工作:

set nocount on; 
declare @YourTable table (BirthDay datetime, PersonName varchar(20)) 
insert into @YourTable VALUES ('1-10-2010',  'Joe' ) 
insert into @YourTable VALUES ('2-10-2010',  'Bob <&>' ) 
insert into @YourTable VALUES ('2-10-2010',  'Alice') 
set nocount off 


--Concatenation with FOR XML and eleminating control/encoded character expansion "& < >" 
SELECT 
    p1.BirthDay 
     ,STUFF(
        (SELECT 
         ', ' + p2.PersonName 
         FROM @YourTable p2 
         WHERE p2.BirthDay=p1.BirthDay 
         ORDER BY p2.PersonName 
         FOR XML PATH(''), TYPE 
        ).value('.','varchar(max)') 
        ,1,2, '' 
      ) AS PersonNames 
    FROM @YourTable p1 
    GROUP BY p1.BirthDay 

OUTPUT:

BirthDay    PersonNames 
----------------------- ------------------------ 
2010-01-10 00:00:00.000 Joe 
2010-02-10 00:00:00.000 Alice, Bob <&> 

(2 row(s) affected) 
0

只需修改KM回答一個存儲過程中

ALTER Procedure [dbo].[Payroll_rptAbsentReport] 
@FromDate DateTime, 
@ToDate DateTime, 
@GFacatoryID UniqueIdentifier 
As 
Begin 
-- Temporary table for Row data seperation 
CREATE TABLE TestTable(GEmployeeGenInfoID uniqueidentifier, dtAttendDateTime varchar(max)) 
INSERT INTO 
      TestTable(GEmployeeGenInfoID, dtAttendDateTime) 
     SELECT 
      Payroll_tblAttendance.GEmployeeGenInfoID 
      ,CONVERT(VARCHAR(max), dtAttendDateTime, 105)dtAttendDateTime 
     FROM Payroll_tblAttendance 
      INNER JOIN PIS.dbo.PIS_tblEmployeeGenInfo as EmployeeGenInfo ON Payroll_tblAttendance.GEmployeeGenInfoID= EmployeeGenInfo.GEmployeeGenInfoID 
      WHERE Payroll_tblAttendance.DayStatusID = 0 AND [email protected] AND Payroll_tblAttendance.dtAttendDateTime Between @FromDate and @ToDate ORDER BY dtAttendDateTime 
-- Final expected output 
SELECT DISTINCT 
     EmployeeGenInfo.StrEmpName 
    ,EmployeeGenInfo.StrEmpID 
    ,Attendence.CardNo 
     ,EmployeeDesignation.StrDesignationName 
     ,EmployeeDept.StrDepartmentName 
     -- Count data will be in one column 
     ,(Select COUNT(*) From TestTable Where GEmployeeGenInfoID=Attendence.GEmployeeGenInfoID) TotalAbsent 
     -- Row data set into one column seperate by coma 
     ,substring((SELECT ', ' + dtAttendDateTime as [text()] 
         FROM TestTable 
         WHERE GEmployeeGenInfoID = Attendence.GEmployeeGenInfoID 
         FOR XML path(''), elements 
        ), 3, 1000 
        ) List 
FROM 
    Payroll_tblAttendance as Attendence 
    INNER JOIN TestTable on TestTable.GEmployeeGenInfoID=Attendence.GEmployeeGenInfoID 
    INNER JOIN PIS.dbo.PIS_tblEmployeeGenInfo as EmployeeGenInfo ON Attendence.GEmployeeGenInfoID= EmployeeGenInfo.GEmployeeGenInfoID 
    INNER JOIN PIS.dbo.PIS_tblDesignationInfo as EmployeeDesignation ON EmployeeGenInfo.GDesignationInfoID= EmployeeDesignation.GDesignationInfoID 
    INNER JOIN PIS.dbo.PIS_tblDepartment as EmployeeDept ON EmployeeGenInfo.GDepartmentID= EmployeeDept.GDepartmentID 
    WHERE [email protected] AND Attendence.DayStatusID = 0 AND Attendence.dtAttendDateTime Between @FromDate and @ToDate 
DROP TABLE TestTable 
END