Как объединить два столбца в один столбец в динамическом своде

у меня такая схема

demo(id, val, month, year, decide)

Демонстрационные данные и схема приведены в этой скрипте http://sqlfiddle.com/#!3/dd89d5/ 1

В выводе я хочу преобразовать строки в столбцы. На выходе я хочу,

ID    (11 14)  (12 14) (2 15) ...     decider
101    0.45     0.5      0.3          411
102    0.4      0.2      0.1          411

Я хочу, чтобы месяц, год были отсортированы

Я перерыл множество тем и нашел скрипку. И попытался настроить в соответствии с моими потребностями

Вот что я пробовал http://sqlfiddle.com/#!3/dd89d5/1

Но не смог получить решение. Помогите мне, пожалуйста


person sanjay Kumar    schedule 10.12.2014    source источник


Ответы (1)


Вот твой стол

create table demo(
    id varchar(max),    val decimal(4,2),    month int,    year int, decider int
  )

INSERT INTO demo
    ([id], [val], [month], [year], [decider])
VALUES

(101, 0.25, 11, 14, 411),
(101, 1, 12, 14, 411),
(101, 0.5, 1, 15, 411),
(101, 0.75, 2, 15, 411),
(102, 0.25, 11, 14, 411),
(102, 0.5, 12, 14, 411),
(102, 0.25, 1, 15, 411),
(101, 0.75, 11, 14, 412),
(101, 0.5, 1, 15, 412),
(101, 0.25, 2, 15, 412),
(102, 0.5, 11, 14, 412),
(102, 0.5, 12, 14, 412),
(103, 0.25, 1, 15, 412),
(103, 0.5, 11, 14, 411)
;

Используйте Dense_Rank, чтобы упорядочить столбец для поворота

SELECT DENSE_RANK() OVER(ORDER BY [YEAR] ,[MONTH]) RNO,*,CAST([MONTH] AS VARCHAR) + ' ' +  CAST([YEAR] AS VARCHAR) DT
INTO #TEMP
FROM
(
    SELECT ID,SUM(VAL)VAL,[MONTH],[YEAR],DECIDER
    FROM DEMO 
    GROUP BY ID,[MONTH],[YEAR],DECIDER
)TAB

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

DECLARE @cols NVARCHAR (MAX)
DECLARE @NullToZeroCols NVARCHAR (MAX)

SELECT @cols = COALESCE (@cols + ',[' + DT + ']', 
              '[' + DT + ']')
               FROM    (SELECT DISTINCT RNO,DT FROM #TEMP) PV  
               ORDER BY RNO

SET @NullToZeroCols = SUBSTRING((SELECT ',ISNULL(['+DT+'],0) AS ['+DT+']' 
FROM(SELECT DISTINCT DT,RNO FROM #TEMP GROUP BY DT,RNO)TAB  
ORDER BY RNO  FOR XML PATH('')),2,8000)

Теперь поверните его

DECLARE @query NVARCHAR(MAX)
SET @query = 'SELECT P.ID,' + @NullToZeroCols + ',DECIDER FROM 
             (
                 SELECT ID, DT, val,DECIDER FROM #TEMP
             ) x
             PIVOT 
             (
                 SUM(val)
                 FOR DT IN (' + @cols + ')
            ) p
            ORDER BY ID;' 

EXEC SP_EXECUTESQL @query

Результат

введите здесь описание изображения

Вот скрипт http://sqlfiddle.com/#!3/95111/1 (Если при загрузке возникает какая-либо ошибка, нажмите RUNSQL)

person Sarath KS    schedule 10.12.2014
comment
Есть ли способ заменить эти нулевые значения на 0? - person sanjay Kumar; 11.12.2014
comment
Я добавил код для замены NULL на ноль в соответствии с вашим обновлением @sanjay - person Sarath KS; 11.12.2014