Как преобразовать столбцы в строки и заменить имена столбцов - PullRequest
0 голосов
/ 13 мая 2018

У меня есть таблица, которая возвращает мне количество продуктов по месяцам подряд, например:

[M02] | [M03] | [M04] | [M05] | [M06] | [M07] | [M08] | [M09] |[M10] | [M11] | [M12]
------------------------------------------------------------------------------------
120   | 65    | 75    | 587   | [78   | 5656  | 651   | 65    | 8949 | 89   | 596

теперь мне нужен результат, так как [здесь я хочу заменить столбцы на строки и изменить их имена на псевдонимы по своему выбору] например, M01 - январь от столбца к строке

  [Month]  | [Count] |
----------------------
  January  |     120 |
  February |     65  |

Я знаю, что могу добиться этого с помощью оператора UnPivot, но я не могу получить название месяца как января, так как не могу установить псевдоним внутри unpivot

Я написал этот запрос

SELECT [Months],[Count]
  FROM [TableName]
  UnPivot(
  [Count] for Months in ([M01]
      ,[M02]
      ,[M03]
      ,[M04]
      ,[M05]
      ,[M06]
      ,[M07]
      ,[M08]
      ,[M09]
      ,[M10]
      ,[M11]
      ,[M12])
  ) as unpiv

это даст мне данные как:

      [Month]  | [Count] |
    ----------------------
      M01      |     120 |
      M02      |     65  |

здесь M01, M02 и т. Д. Соответственно месяцы, но я не могу изменить их имя. как мне этого добиться?

Ответы [ 2 ]

0 голосов
/ 13 мая 2018

Вы не можете назначить псевдоним внутри функции UNPIVOT, поэтому вам придется использовать выражение CASE.

0 голосов
/ 13 мая 2018

Подход 1 : Использование CASE WHEN

Вы можете использовать CASE WHEN, как показано ниже, чтобы получить желаемый результат.

SELECT    
    (CASE 
    WHEN [Months]= 'M01' then 'January'
    WHEN [Months]= 'M02' then 'February'
        --PUT Remaning conditions
    END) [Months],
    [Count]

FROM
(
SELECT [Months],[Count]
    FROM [TableName]
    UnPivot(
    [Count] for Months in ([M01]
        ,[M02]
        ,[M03]
        ,[M04]
        ,[M05]
        ,[M06]
        ,[M07]
        ,[M08]
        ,[M09]
        ,[M10]
        ,[M11]
        ,[M12])
    ) as unpiv
)T

Подход 2: INNER JOIN к таблице сопоставления

У вас может быть таблица сопоставления, в которой вы сопоставляете свои коды с месяцами и ставите INNER JOIN как

SELECT 
MP.MonthName,
T.[Count]
FROM
(
SELECT [Months],[Count]
  FROM [TableName]
  UnPivot(
  [Count] for Months in ([M01]
      ,[M02]
      ,[M03]
      ,[M04]
      ,[M05]
      ,[M06]
      ,[M07]
      ,[M08]
      ,[M09]
      ,[M10]
      ,[M11]
      ,[M12])
  ) as unpiv
)t
INNER JOIN [YourMappingTable] MP ON MP.Code=T.Months

Подход3 : строковые функции.

Другим подходом может быть использование RIGHT с PATINDEX для получения номера и, наконец, преобразование числа в название месяца.

SELECT 
DateName( month , DateAdd( month ,  CAST(RIGHT(T.[Months],PATINDEX('%[0-9]%',T.[Months])) AS INT) , 0 ) - 1 ) as Months,
[Count]
FROM
(
SELECT [Months],[Count]
  FROM [TableName]
  UnPivot(
  [Count] for Months in ([M01]
      ,[M02]
      ,[M03]
      ,[M04]
      ,[M05]
      ,[M06]
      ,[M07]
      ,[M08]
      ,[M09]
      ,[M10]
      ,[M11]
      ,[M12])
  ) as unpiv
)t

Примечание: Если формат фиксированный, вы также можете попробовать выполнить следующее, не используя PATINDEX

DateName( month , DateAdd( month ,  CAST(RIGHT(T.[Months],2) AS INT) , 0 ) - 1 ) as Months,
...