2016-10-05 3 views
1

Я пытаюсь использовать это в моем запросе:Max в SQL сервере

MAX(CASE WHEN year = 2014 THEN remark ELSE '-' END) 

Таблица образца:

EmpID Year Remark 
1  2016 Normal 
1  2014 Good 
1  2015 Very Good 
1  2016 Good 
1  2010 Poor 
1  2016 Well 

Сообщить я получаю:

EmpID 2010 2014 2015  2016 
1  Poor Good Very Good Normal 

Отчет Я на самом деле хочу :

EmpID 2010 2014 2015   2016 
1  Poor Good Very Good Normal - Good - Well 

Когда я вызываю запрос, я получаю только одну строку, но я хочу объединить все строки для соответствующего года.

Как это сделать?

Заранее спасибо

+0

Вы хотите год столбцы быть динамическим или статическим? –

+1

Я уже получаю это динамически, используя отчетный запрос года, но это не проблема – Pravin

ответ

4

Это не имеет ничего общего с 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 
+1

Лучший ответ, потому что это объясняет использование 'STUFF',' XML' и 'PIVOT' – GauravKP

+0

спасибо за ответ – Pravin

+0

это работает для меня, но еще одна вещь, если i хотите прикрепить более одного столбца в разделе «Замечание», например, «Прикрепить», добавьте примечание + «» + Оценка - примечание + «» + Оценка возможно – Pravin

0

Я думаю, вы можете объединить вашу строку так:

SELECT T.EmpID 
    , T.[Year] 
    , STUFF(T2.[Remark], 1, 3, '') AS Remark 
FROM (SELECT DISTINCT EmpID, [Year] FROM #Test) AS T 
CROSS APPLY (
    SELECT CONCAT(' - ', T2.Remark) 
    FROM #Test AS T2 
    WHERE T2.EmpID = T.EmpID 
     AND T2.[Year] = T.[Year] 
    FOR XML PATH ('') 
    ) AS T2(Remark); 

Query abo ве выведет на экран это:

╔═══════╦══════╦══════════════════════╗ 
║ EmpID ║ Year ║  Remark  ║ 
╠═══════╬══════╬══════════════════════╣ 
║  1 ║ 2010 ║ Poor     ║ 
║  1 ║ 2014 ║ Good     ║ 
║  1 ║ 2015 ║ Very Good   ║ 
║  1 ║ 2016 ║ Normal - Good - Well ║ 
╚═══════╩══════╩══════════════════════╝ 

Теперь вы просто должны повернуть его на основе EmpID и Year ценности, которые вы уже знаете, как это сделать, на основе ваших комментариев.

+0

благодарит за ответ – Pravin

1

Вы можете запросить как этот

;WITH cte 
AS (SELECT 
    empid, year, 
    STUFF((SELECT ' - ' + remark FROM #table WHERE empid = t.empid AND year = t.year 
    FOR xml PATH ('')), 1, 3, '') AS testRemark 
FROM #table t 
GROUP BY empid, year) 
SELECT * 
FROM cte 
PIVOT (MAX(testRemark) FOR year IN ([2010], [2014], [2015], [2016])) p 

Выход:

empid 2010 2014 2015  2016 
1  Poor Good Very Good Normal - Good - Well 
+0

благодарит за ответ – Pravin