私はテーブルを持っています:
name quantity
abc 2
abc 3
abc 5
次のように、mssql でクエリを実行して結果を 1 行で表示するにはどうすればよいですか
abc 2 3 5
ありがとう。
私はテーブルを持っています:
name quantity
abc 2
abc 3
abc 5
次のように、mssql でクエリを実行して結果を 1 行で表示するにはどうすればよいですか
abc 2 3 5
ありがとう。
このデータを別々の列に入れたい場合は、次の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 PATH
andを使用でき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 を参照してください