SQL server: отключите столбец в другой и добавьте его значение в отдельный столбец

#sql #sql-server #unpivot

#sql #sql-server #открепить

Вопрос:

у меня следующий формат таблицы (скорее, ее представление) с примером примера

  Name  | MonthYear |      Type     | budget | actual | revenue_forecast
google |   Nov-20  | Gross Billing |   50   |   70   | 40
  

Я хочу сделать так, чтобы у меня было две строки, при этом ‘revenue_forecast’ становится типом, а его значение отображается в разделе бюджет, например

  Name  | MonthYear |      Type        | budget | actual 
google |   Nov-20  | Gross Billing    |   50   |   70   
google |   Nov-20  | revenue_forecast |   40   |   null   
  

есть идеи, как это можно сделать? немного борюсь с логикой открепления для этого сценария

Комментарии:

1. Чтобы мы могли быстро ответить на вопросы такого типа, вы должны опубликовать сообщение в форме инструкции, которая создает исходную таблицу или переменную, или с настройкой набора данных в SQLFiddle

Ответ №1:

Вы можете попытаться разархивировать с помощью VALUES конструктора табличных значений, но внимательно изучите типы данных столбцов:

 SELECT t.Name, t.MonthYear, v.[Type], v.budget, v.actual
FROM YourTable t
CROSS APPLY (VALUES
   (t.[type], t.budget, t.actual),
   ('revenue_forecast', t.revenue_forecast, NULL)
) v ([type], budget, actual)
  

Для проверки этого можно использовать следующий полный запрос:

 declare @table Table
(
    Name varchar(50),
    MonthYear varchar(10),
    Type Varchar(50),
    budget int,
    actual int,
    revenue_forecast int
)
INSERT INTO @table (Name, MonthYear, Type, budget, actual, revenue_forecast)
Values('google', 'Nov-20','Gross Billing',50,70,40)

select * from @table

SELECT t.Name, t.MonthYear, v.[Type], v.budget, v.actual
FROM @table t
CROSS APPLY (VALUES
   (t.[type], t.budget, t.actual),
   ('revenue_forecast', t.revenue_forecast, NULL)
) v ([type], budget, actual)
  

Комментарии:

1. Проверено, это выполняет свою работу