私は出力の後に私を返す1つのクエリを持っています。SQLで行データをコンマで区切る方法は?
(結果ではない同じなしすべての時間..時にはそれが3カテゴリ、時には8カテゴリなどを与える意味)
区分名
- Test1を
- Test2を
- Test3は
今、私はそのストアプロシージャが必要ですこれらの日付をカンマ区切り形式で返信してください。例: 出力文字列は次のようになります:Test1、Test2、Test3
私はこれをどのように達成できますか教えてください。
私は出力の後に私を返す1つのクエリを持っています。SQLで行データをコンマで区切る方法は?
(結果ではない同じなしすべての時間..時にはそれが3カテゴリ、時には8カテゴリなどを与える意味)
区分名
今、私はそのストアプロシージャが必要ですこれらの日付をカンマ区切り形式で返信してください。例: 出力文字列は次のようになります:Test1、Test2、Test3
私はこれをどのように達成できますか教えてください。
COALESCE
またはISNULL
試してみてください& => &
OPは、CategoryNameがnullかどうかを示すものではありません。ただし、クエリでは、文字列全体を削除するNULLから保護するために、CategoryNameの周りにCOALESCEまたはISNULLを追加することができます。 (文字列を連結するときにNULLから保護する)ことは良い習慣であり、後でやりがいのないデバッグを防ぐことができます。 –
(全実施例)のようなものを見てください
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
データに「<' or '>」や「&」などの共通文字が含まれている場合、これは機能しません。 –
一つの意味:
SELECT STUFF((
SELECT ',' + CategoryName AS [text()]
FROM YourTable
FOR XML PATH('')
), 1, 1, '')
を...しかし、アップエスケープされるXMLエンティティに気を付ける - 例えば
あなたは簡単に特殊なXML文字の問題を避けることができます、どのように私の答えを参照してください。 –
クール - ありがとうKMは、将来を考えています! –
これはあなたのデータ内のすべての文字のために動作します:
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)
ただ、店舗手順で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
の可能重複[ SQL Server:カンマで複数の行を1つの列に区切ることはできますか?](http://stackoverflow.com/questions/2046037/sql-server-ca) n-i-comma-delimit-multiple-rows-into-one-column) –
なぜあなたはクライアントサイドアプリではなくサーバー側でこれを行うのですか? – Juliet