1

私はテーブルを持っています:

name quantity
abc     2
abc     3
abc     5

次のように、mssql でクエリを実行して結果を 1 行で表示するにはどうすればよいですか

abc 2 3 5

ありがとう。

4

1 に答える 1

4

このデータを別々の列に入れたい場合は、次のPIVOT関数を使用できます。

select *
from 
(
  select name, quantity,
    'Qty_'+cast(row_number() over(partition by name order by quantity) as varchar(10)) rn
  from yourtable
) src
pivot
(
  max(quantity)
  for rn in (Qty_1, Qty_2, Qty_3)
) piv

SQL Fiddle with Demoを参照してください。ピボットの結果は次のとおりです。

| NAME | QTY_1 | QTY_2 | QTY_3 |
--------------------------------
|  abc |     2 |     3 |     5 |

このデータを単一の列に入れたい場合は、FOR XML PATHandを使用できSTUFF()ます。

SELECT
     t1.Name,
     STUFF(
         (SELECT ' ' + cast(quantity as varchar(10))
          FROM yourtable t2
          WHERE t1.name = t2.name
          FOR XML PATH (''))
          , 1, 1, '')  AS List
FROM yourtable t1
GROUP BY t1.Name

SQL Fiddle with Demoを参照してください。このクエリの結果は次のとおりです。

| NAME |  LIST |
----------------
|  abc | 2 3 5 |

ピボット関数を使用すると、不明な数の数量値がある場合、動的 SQL を使用できます。

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(rn) 
                    from
                    (
                      select 'Qty_'+cast(row_number() over(partition by name order by quantity) as varchar(10)) rn
                      from yourtable
                    ) t
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT name,' + @cols + ' from 
             (
                select name, quantity,
                  ''Qty_''+cast(row_number() over(partition by name order by quantity) as varchar(10)) rn
                from yourtable
            ) x
            pivot 
            (
                max(quantity)
                for rn in (' + @cols + ')
            ) p '

execute(@query)

デモで SQL Fiddle を参照してください

于 2013-02-28T15:29:34.910 に答える