2014-12-10 3 views
1

У меня есть схема, как этотКак объединить два столбца в один столбец в динамической оси

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

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

ответ

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 

Результат

enter image description here

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

+0

Есть ли способ, чтобы заменить эти нулевые значения до 0? – sanjay

+0

Да. Я обновлю запрос @sanjay –

+0

Я добавил код, чтобы заменить NULL нулем в соответствии с вашим обновлением @sanjay –

Смежные вопросы