Этот запрос работает, но кажется ужасно неэффективным. Должен ли быть лучший способ?
То, что я пытаюсь сделать, - это выбрать 4 разных столбца из таблицы MarketRates в зависимости от того, на какой территории находится компания. В таблице Company есть только 4 территории, которые хранятся как целое число 1-4. Например, если «Территория» равна «1», то я хочу выбрать 4 столбца Южной Калифорнии (имена столбцов SCA *), но если «Территория» равна «2», то я хочу выбрать 4 столбца Северной Калифорнии ( имена столбцов NCA *) и т. д.
Я знаю, что таблицы должны быть построены по-другому, но это то, с чем я должен иметь дело.
Таблица MarketRates содержит эти столбцы (SCA = Южная Калифорния, NCA = Северная Калифорния, SNV = Южная Невада, NAZ = Северная Аризона:
- Дата окончания - дата
- SCA_MRK - десятичное число (8,2)
- SCA_RATE - десятичное число (8,2)
- SCA_COMP - десятичное число (8,2)
- SCA_NEG - десятичное число (8,2)
- NCA_MRK - десятичное число (8,2)
- NCA_RATE - десятичное число (8,2)
- NCA_COMP - десятичное число (8,2)
- NCA_NEG - десятичное число (8,2)
- SNV_MRK - десятичное число (8,2)
- SNV_RATE - десятичное число (8,2)
- SNV_COMP - десятичное число (8,2)
- SNV_NEG - десятичный (8,2)
- NAZ_MRK - десятичное число (8,2)
- NAZ_RATE - десятичное число (8,2)
- NAZ_COMP - десятичное число (8,2)
- NAZ_NEG - десятичное число (8,2)
Это текущий запрос, который я использую:
Select CompanyName
, case TerritoryNumber
when 1 then (Select top 1 coalesce(SCA_MRK,0) From MarketRates Order by EndingDate desc)
when 2 then (Select top 1 coalesce(NCA_MRK,0) From MarketRates Order by EndingDate desc)
when 3 then (Select top 1 coalesce(SNV_MRK,0) From MarketRates Order by EndingDate desc)
when 4 then (Select top 1 coalesce(NAZ_MRK,0) From MarketRates Order by EndingDate desc)
end AS MRK
, case TerritoryNumber
when 1 then (Select top 1 coalesce(SCA_RATE,0) From MarketRates Order by EndingDate desc)
when 2 then (Select top 1 coalesce(NCA_RATE,0) From MarketRates Order by EndingDate desc)
when 3 then (Select top 1 coalesce(SNV_RATE,0) From MarketRates Order by EndingDate desc)
when 4 then (Select top 1 coalesce(NAZ_RATE,0) From MarketRates Order by EndingDate desc)
end AS RATE
, case TerritoryNumber
when 1 then (Select top 1 coalesce(SCA_COMP,0) From MarketRates Order by EndingDate desc)
when 2 then (Select top 1 coalesce(NCA_COMP,0) From MarketRates Order by EndingDate desc)
when 3 then (Select top 1 coalesce(SNV_COMP,0) From MarketRates Order by EndingDate desc)
when 4 then (Select top 1 coalesce(NAZ_COMP,0) From MarketRates Order by EndingDate desc)
end AS COMP
, case TerritoryNumber
when 1 then (Select top 1 coalesce(SCA_NEG,0) From MarketRates Order by EndingDate desc)
when 2 then (Select top 1 coalesce(NCA_NEG,0) From MarketRates Order by EndingDate desc)
when 3 then (Select top 1 coalesce(SNV_NEG,0) From MarketRates Order by EndingDate desc)
when 4 then (Select top 1 coalesce(NAZ_NEG,0) From MarketRates Order by EndingDate desc)
end AS NEG
from Company
where CompanyID = 'THISID'