#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. Проверено, это выполняет свою работу