Это не имеет ничего общего с MAX, потому что вы можете использовать поворотную + STUFF с FOR XML PATH:
SELECT *
FROM (
SELECT DISTINCT t.EmpID,
t.[Year],
STUFF((
SELECT '-'+Remark
FROM YourTable
WHERE t.EmpID = EmpID AND t.[Year] = [Year]
FOR XML PATH('')
),1,1,'') Remark
FROM YourTable t
) as d
PIVOT (
MAX(Remark) FOR [Year] IN ([2010],[2014],[2015],[2016])
) as pvt
В d
части вы получите:
EmpID Year Remark
1 2010 Poor
1 2014 Good
1 2015 Very Good
1 2016 Normal-Good-Well
STUFF
предназначенный для удаления сверху -
,
FOR XML PATH
используется, чтобы сделать значения из строк в 1 строке,
PIVOT
для преобразования строк в столбцы
Выход:
EmpID 2010 2014 2015 2016
1 Poor Good Very Good Normal-Good-Well
РЕДАКТИРОВАТЬ # 1
Другой способ с MAX и случай, когда (тот же выход):
SELECT EmpID,
MAX(CASE WHEN [Year] = 2010 THEN Remark END) as [2010],
MAX(CASE WHEN [Year] = 2014 THEN Remark END) as [2014],
MAX(CASE WHEN [Year] = 2015 THEN Remark END) as [2015],
MAX(CASE WHEN [Year] = 2016 THEN Remark END) as [2016]
FROM (
SELECT DISTINCT t.EmpID,
t.[Year],
STUFF((
SELECT '-'+Remark
FROM YourTable
WHERE t.EmpID = EmpID AND t.[Year] = [Year]
FOR XML PATH('')
),1,1,'') Remark
FROM YourTable t
) as d
GROUP BY EmpID
EDIT # 2
Динамический SQL:
DECLARE @sql nvarchar(max),
@col nvarchar(max)
SELECT @col = (
SELECT DISTINCT ','+QUOTENAME([Year])
FROM YourTable
FOR XML PATH('')
)
SELECT @sql = N'
SELECT *
FROM (
SELECT DISTINCT t.EmpID,
t.[Year],
STUFF((
SELECT ''-''+Remark
FROM YourTable
WHERE t.EmpID = EmpID AND t.[Year] = [Year]
FOR XML PATH('''')
),1,1,'''') Remark
FROM YourTable t
) as d
PIVOT (
MAX(Remark) FOR [Year] IN ('+STUFF(@col,1,1,'')+')
) as pvt'
EXEC sp_executesql @sql
Вы хотите год столбцы быть динамическим или статическим? –
Я уже получаю это динамически, используя отчетный запрос года, но это не проблема – Pravin