1

すべての従業員の給与を返す次のクエリがあります。これは完全に機能しますが、1つのセルに集約する追加のデータを収集する必要があります(結果セット2を参照)。

データをカンマ区切りのリストに集約するにはどうすればよいですか?Sumと少し似ていますが、代わりに文字列が必要です。

SELECT Employee.Id, SUM(Pay) as Salary
FROM Employee
INNER JOIN PayCheck ON PayCheck.EmployeeId = Employee.Id
GROUP BY Employee.Id

結果セット1

Employee.Id              Salary
-----------------------------------
          1                 150
          2                 250
          3                 350

私は欲しい:

結果セット2

Employee.Id              Salary                 Data
----------------------------------------------------
          1                 150      One, Two, Three
          2                 250      Four, Five, Six
          3                 350      Seven
4

2 に答える 2

3

SQL Server 2005以降の場合は、STUFF関数とFORXMLPATHを使用します。

WITH summary_cte AS (
   SELECT Employee.Id, SUM(Pay) as Salary
     FROM Employee
     JOIN PayCheck ON PayCheck.EmployeeId = Employee.Id
 GROUP BY Employee.Id)
SELECT sc.id, 
       sc.salary,
       STUFF((SELECT ','+ yt.data
                FROM your_table yt
               WHERE yt.id = sc.id
            GROUP BY yt.data
             FOR XML PATH(''), TYPE).value('.','VARCHAR(max)'), 1, 1, '')
  FROM summary_cte sc

しかし、コンマ区切りの文字列に変換するデータの場所と、それが従業員レコードとどのように関連しているかについての詳細が欠落しています...

于 2010-06-25T20:18:53.313 に答える
0

目の前にコードがないか、簡単な例を示しますが、このためのCLR集計を作成することを検討します。その非常に簡単です。使用する自動作成されたメソッドがいくつかあり、それらは収集(List <>オブジェクトなどに追加)、マージ(複数のスレッドで作成された複数のリストをマージ)、および出力(リストを取得して変換する)専用です。文字列-String.Join( "、"、list.ToArray()))。知っておくべきことは、8000文字の長さ制限があるということだけです。

于 2010-06-25T20:08:18.837 に答える