2015-08-20 1 views
-1

У меня есть таблица LEAVTYPE: -Как я могу использовать pivot для большего количества столбцов?

 LM_ID EMPCODE CCODE FINYEAR LVTYPE WEF     OPN_BAL ENTITLE ELIGIBLE AVAILED 
     1 180480 IBTEH 2015-2016 CL 2015-07-31 00:00:00 4.50 0 4.50 1.50 
     3 180480 IBTEH 2015-2016 LE 2015-07-31 00:00:00 35.50 0 35.50 0.00 
     4 180480 IBTEH 2015-2016 PL 2015-07-31 00:00:00 6.00 1 7.00 0.00 
     8 180541 IBTEH 2015-2016 LE 2015-07-31 00:00:00 33.50 0 33.50 0.50 
     9 180541 IBTEH 2015-2016 PL 2015-07-31 00:00:00 1.50 1 2.50 1.50 
     11 180546 IBTEH 2015-2016 CL 2015-07-31 00:00:00 8.00 0 8.00 1.00 
     13 180546 IBTEH 2015-2016 LE 2015-07-31 00:00:00 32.00 0 32.00 0.00 
     14 180546 IBTEH 2015-2016 PL 2015-07-31 00:00:00 6.00 1 7.00 0.00 
     15 180546 IBTEH 2015-2016 CO 2015-07-31 00:00:00 1.00 0 1.00 1.00 

Теперь я хочу, чтобы структура таблицы, как: -

LM_ID EMPCODE CCODE FINYEAR  WEF    CL_OPN_BAL  CL_ENTITLE  CL_ELIGIBLE CL_AVAILED LE_OPN_BAL  LE_ENTITLE  LE_ELIGIBLE LE_AVAILED PL_OPN_BAL  PL_ENTITLE  PL_ELIGIBLE PL_AVAILED 

1  180480 IBTEH 2015-2016 2015-07-31 00:00:00 4.50   0    4.50   1.50   35.50   0    35.50   0.00   6.00   1   7.00    0.00 

, как я могу получить это для каждой группы EMPCOPDE.

ответ

0

Прежде вы можете использовать CROSS APPLY или OUTER APPLY, чтобы получить столбцы в строки таким образом, чтобы объединить значения строк с именами столбцов

SELECT DISTINCT LM_ID,EMPCODE, CCODE, FINYEAR, WEF, 
LVTYPE+'_'+COLNAME COLNAME,VALS 
INTO NEWTBL 
FROM TEMPTBL 
OUTER APPLY(VALUES (OPN_BAL,'OPN_BAL'),(ENTITLE,'ENTITLE'),(ELIGIBLE,'ELIGIBLE'),(AVAILED,'AVAILED')) 
COLUMNNAMES(VALS,COLNAME) 

Теперь я подставила временную таблицу NEWTBL так, чтобы повторно использовать для выбор столбцов до PIVOT, а также удобство чтения в динамическом PIVOT.

Здесь я объявляю переменную для выбора имен столбцов для поворота.

DECLARE @cols NVARCHAR (MAX) 

SELECT @cols = COALESCE (@cols + ',[' + COLNAME + ']', '[' + COLNAME + ']') 
       FROM (SELECT DISTINCT COLNAME FROM NEWTBL) PV 
       ORDER BY COLNAME 

Теперь вы должны выполнить его в динамическом запросе, поскольку имена столбцов являются динамическими по своей природе.

DECLARE @query NVARCHAR(MAX) 
SET @query = 'SELECT * FROM 
      (
       SELECT DISTINCT LM_ID,EMPCODE, CCODE, FINYEAR, WEF, COLNAME, VALS 
       FROM NEWTBL 
      ) x 
      PIVOT 
      (
       MIN(VALS) 
       FOR COLNAME IN (' + @cols + ') 
      ) p 
      '  
EXEC SP_EXECUTESQL @query 

Ниже рабочей версии

SQL FIDDLE

EDIT:

Почему мой ответ выше становится повторен EMPCODE, что я добавил LM_ID согласно ожидаемого результата , В этом случае он также будет группироваться. Просто не включайте LM_ID в ваш результат, вы получите уникальную строку для каждого EMPCODE.

Click here для просмотра результата

+0

U также может использовать таблицу Hash вместо постоянных таблиц. Пожалуйста, ответьте, если у вас есть какие-либо сомнения @david sam –

+0

Я хочу, чтобы все данные EMPCODE были в одной строке, но ваш запрос дает EMPCODE во многих строках. –

+0

U может добавить больше количества строк в ожидаемый результат ur. К. Я буду обновлять @david sam –

1

Это будет работать. Мы будем собирать другие статистические данные из групп на основе LVTYPE.

WITH CTE 
AS 
(
SELECT LM_ID, EMPCODE, CCODE, FINYEAR, WEF, 
     CASE WHEN LVTYPE ='CL' THEN (OPN_BAL) END AS CL_OPN_BAL, 
     CASE WHEN LVTYPE ='CL' THEN (ENTITLE) END AS CL_ENTITLE, 
     CASE WHEN LVTYPE ='CL' THEN (ELIGIBLE) END AS CL_ELIGIBLE, 
     CASE WHEN LVTYPE ='CL' THEN (AVAILED) END AS CL_AVAILED , 
     CASE WHEN LVTYPE ='LE' THEN (OPN_BAL) END AS LE_OPN_BAL, 
     CASE WHEN LVTYPE ='LE' THEN (ENTITLE) END AS LE_ENTITLE, 
     CASE WHEN LVTYPE ='LE' THEN (ELIGIBLE) END AS LE_ELIGIBLE, 
     CASE WHEN LVTYPE ='LE' THEN (AVAILED) END AS LE_AVAILED, 
     CASE WHEN LVTYPE ='PL' THEN (OPN_BAL) END AS PL_OPN_BAL, 
     CASE WHEN LVTYPE ='PL' THEN (ENTITLE) END AS PL_ENTITLE, 
     CASE WHEN LVTYPE ='PL' THEN (ELIGIBLE) END AS PL_ELIGIBLE, 
     CASE WHEN LVTYPE ='PL' THEN (AVAILED) END AS PL_AVAILED,    
     ROW_NUMBER() OVER(PARTITION BY EMPCOPDE ORDER BY EMPCOPDE) as indx 
    FROM LEAVTYPE 

) 

SELECT LM_ID, EMPCODE, CCODE, FINYEAR, WEF, CL_OPN_BAL, CL_ENTITLE, CL_ELIGIBLE,CL_AVAILED ,LE_OPN_BAL,LE_ENTITLE, LE_ELIGIBLE, LE_AVAILED, PL_OPN_BAL, PL_ENTITLE, PL_ELIGIBLE, PL_AVAILED 
FROM CTE 
WHERE indx=1 

В группе с различными значениями indx будет много записей. Здесь index = 1 покажет одну запись из каждой группы.

+0

не дает правильный ответ –

+0

@davidsam бы вы хотели показать мне результаты этого запроса? С экрана. Или отправьте структуру таблицы. –

+0

показывает только содержание индекса 1 не для 2,3,4 –