2010-12-07 14 views
0

私は出力の後に私を返す1つのクエリを持っています。SQLで行データをコンマで区切る方法は?

(結果ではない同じなしすべての時間..時にはそれが3カテゴリ、時には8カテゴリなどを与える意味)

区分名

  • Test1を
  • Test2を
  • Test3は

今、私はそのストアプロシージャが必要ですこれらの日付をカンマ区切り形式で返信してください。例: 出力文字列は次のようになります:Test1、Test2、Test3

私はこれをどのように達成できますか教えてください。

+1

の可能重複[ SQL Server:カンマで複数の行を1つの列に区切ることはできますか?](http://stackoverflow.com/questions/2046037/sql-server-ca) n-i-comma-delimit-multiple-rows-into-one-column) –

+0

なぜあなたはクライアントサイドアプリではなくサーバー側でこれを行うのですか? – Juliet

答えて

1

COALESCEまたはISNULL試してみてください& => &

+0

OPは、CategoryNameがnullかどうかを示すものではありません。ただし、クエリでは、文字列全体を削除するNULLから保護するために、CategoryNameの周りにCOALESCEまたはISNULLを追加することができます。 (文字列を連結するときにNULLから保護する)ことは良い習慣であり、後でやりがいのないデバッグを防ぐことができます。 –

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 

また、あなたはグーグルが答えの多くを提供することを見つけるかもしれません。

DECLARE @returnValue varchar(MAX) 

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

データに「<' or '>」や「&」などの共通文字が含まれている場合、これは機能しません。 –

0

一つの意味:

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

を...しかし、アップエスケープされるXMLエンティティに気を付ける - 例えば

+1

あなたは簡単に特殊なXML文字の問題を避けることができます、どのように私の答えを参照してください。 –

+0

クール - ありがとうKMは、将来を考えています! –

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 
関連する問題