0

こんにちは、従業員のすべての割り当てを同じ行に含める必要があります。従業員の中には、1 つの割り当てを持つ人もいれば、3 つ以上の割り当てを持つ人もいます。これは、sproc に入り、そのレコードの下にあるすべての割り当てを元に戻すことです。

3 つのレコードがあるデータベースのレコードの例:
John doe - assign1
John doe - assign2
John doe - assign3

望ましい結果:
3、assign1、assign2、assign3

1 つのレコードを含むデータベース内のレコードの例:
John doe - assign1

望ましい結果:
1, assign1

これは私がこれまでに持っているものですが、機能させることはできません。

    SELECT cast(count(*) as varchar(10))+', ' + min([Assign1])+', '+
max([Assign1]), max([Assign1])
From assignment
where year = '2012'
and first_name = 'firstname'
and last_name = 'lastname'

これは、ダムダウンされたテーブル構造です。

Create INTO [database].[dbo].[assignment]
           ([employee_key]
           ,[last_name]
           ,[first_name]
           ,[assignment_code]
           ,[assignment_desc] )
4

1 に答える 1

1

コマンドの使用を検討しますSTUFF。これは、ID 列 (テーブル スキーマが必要) がある場合に最適化できますが、上記のコードを考えると、次のようになります。

Select cast(count(*) as varchar) + ', ' +
   stuff((select  ', '+A2.Assign1
         from Assignment A2
         where year = '2012'
             and first_name = 'john'
             and last_name = 'doe'
         for xml path(''), type).value('.', 'nvarchar(max)'), 1, 2, '')
FROM Assignment A1
WHERE year = '2012'
   and first_name = 'john'
   and last_name = 'doe'

そしてSQLフィドル

ここでは、WHERE 句を 2 回ハードコーディングしていません。

Select count(*), 
   stuff((select  ', '+A2.Assign1
         from Assignment A2
         where A2.Year = A1.Year and 
            A2.First_Name = A1.First_Name and 
            A2.Last_Name = A1.Last_Name
         for xml path(''), type).value('.', 'nvarchar(max)'), 1, 2, '')
FROM Assignment A1
WHERE year = '2012'
    and first_name = 'john'
    and last_name = 'doe'
GROUP BY year, first_name, last_name

幸運を。

于 2013-01-17T16:55:22.850 に答える