行から列にデータをピボットする場合、これを行う方法がいくつかあります。CASE 式で集計関数を使用することも、SQL Server を使用しているため、PIVOT 関数を使用することもできます。どちらの場合も、group by を使用して何らかの集計を適用します。
と を表示したいだけなので、文字列列に集計関数を適用すると、 を使用すると 1 行が返されratings
ます。name
GROUP BY
CASE で集計関数を使用する構文は次のようになります。
select
max(case when name = 'Dinner' then ratings end) Dinner,
max(case when name = 'Lunch' then ratings end) Lunch
from tbl_feedback f
inner join tbl_criteria c
on f.creteria = c.d;
SQL Fiddle with Demoを参照してください。しかし、上記のクエリを実行すると、1 行しか返されません。
| DINNER | LUNCH |
------------------
| B | C |
したがって、個別の行を最終結果に含めることができる値を含める必要があります。SQL Server を使用しているため、row_number()
. を含めると、次row_number()
のようにデータを分割できます。creteria
select
max(case when name = 'Dinner' then ratings end) Dinner,
max(case when name = 'Lunch' then ratings end) Lunch
from
(
select f.ratings, c.name,
row_number() over(partition by f.creteria order by f.id) rn
from tbl_feedback f
inner join tbl_criteria c
on f.creteria = c.d
) d
group by rn;
SQL Fiddle with Demoを参照してください。row_number は、group by を適用するときに必要な一意の値を生成します。
row_number()
PIVOT 関数を使用するときにも使用できます。
select dinner, lunch
from
(
select f.ratings, c.name,
row_number() over(partition by f.creteria order by f.id) rn
from tbl_feedback f
inner join tbl_criteria c
on f.creteria = c.d
) d
pivot
(
max(ratings)
for name in (dinner, lunch)
) piv;
SQL Fiddle with Demoを参照してください。これらのクエリの最終結果は次のようになります。
| DINNER | LUNCH |
-------------------
| A | C |
| B | (null) |
編集#1:条件名の数が不明または動的な場合は、動的SQLを使用して結果を生成する必要があります。
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(name)
from tbl_Criteria
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT ' + @cols + '
from
(
select f.ratings, c.name,
row_number() over(partition by f.creteria order by f.id) rn
from tbl_feedback f
inner join tbl_criteria c
on f.creteria = c.d
) d
pivot
(
max(ratings)
for name in (' + @cols + ')
) p '
execute(@query)
デモで SQL Fiddle を参照してください