RDBMSを指定しませんでしたが、MySQLを使用していて、返される値の数が不明な場合は、プリペアドステートメントを使用します。
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'sum(case when month_end = ''',
month_end,
''' then salary end) AS ',
month_end
)
) INTO @sql
FROM yourTable;
SET @sql = CONCAT('SELECT Emp_Id, ', @sql, '
FROM yourtable
GROUP BY Emp_Id');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
または、@ Mahmoudの回答と同様の静的バージョンを使用して、すべての月をハードコーディングできます。
SQL Serverと同様の機能を持つRDBMSで作業している場合はPIVOT
、次を使用できます。
select *
from
(
select emp_id, salary, month_end
from yourtable
) x
pivot
(
max(salary)
for month_end in ([jan], [feb], [mar])
) p
または動的SQLを使用する:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(month_end)
from yourtable
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT emp_id, ' + @cols + ' from
(
select emp_id, salary, month_end
from yourtable
) x
pivot
(
max(salary)
for month_end in (' + @cols + ')
) p '
execute(@query)