SQL - Расчет третьего столбца из двух предыдущих - PullRequest
0 голосов
/ 17 июня 2019

Я только что запустил SQL, и у меня возникли некоторые трудности с точки зрения мышления на этом языке.

Теперь у меня есть задача, в которой мне нужно создать новый столбец в таблице со значениями из предыдущих столбцов.Этот расчет основан на нескольких условиях.Можно ли это даже легко сделать в SQL?

Допустим, у меня есть таблица с именем dbo.country_sales, где

Select *
From dbo.country

генерирует

CountryName, Year, Sales
—————————
Argentina, 2015, 10
Argentina, 2017, 22
Florida, 2015, 10
Florida, 2017, 8
Germany, 2015, null
Germany, 2017, null

Мне нужно создатьчетвертый столбец с динамикой продаж в период с 2015 по 2017 год (продажи в 2017 году - продажи в 2015 году), поэтому таблица будет выглядеть следующим образом:

CountryName, Year, Sales, Development
—————————
Argentina, 2015, 10, 12
Argentina, 2017, 22, 12
Florida, 2015, 10, -2
Florida, 2017, 8, -2
Germany, 2015, null, null
Germany, 2017, null, null

Я знаю, как сделать это в операторе выбора, но рассчитывается только 1 значение,Пытался искать несколько часов, но не нашел ничего простого.

Спасибо за помощь.Lan

Ответы [ 3 ]

3 голосов
/ 17 июня 2019

Один простой метод использует оконные функции и условное агрегирование:

select c.*,
       sum(case when year = 2017 then sales
                when year = 2015 then - sales
           end) over (partition by country) as diff_2017_2015
from dbo.country c
where year in (2015, 2017);
1 голос
/ 17 июня 2019

Вы можете использовать CTE для предварительного вычисления значений. Например:

with a as (
  select countryname, year, sales from t where year = 2015
),
b as (
  select countryname, year, sales from t where year = 2017
),
c as (
  select a.countryname, b.sales - a.sales as development
  from a
  join b on a.countryname = b.countryname
)
select a.*, c.development
from a
join c on c.countryname = a.countryname
union 
select b.*, c.development
from b
join c on c.countryname = b.countryname
order by countryname, year
0 голосов
/ 17 июня 2019

Для немного более экзотического решения, которое может дать вам больше гибкости для будущего использования, вы можете создать вспомогательную функцию.

CREATE FUNCTION dbo.udf_SalesDiff(
  @CountryName  VARCHAR(50)
 ,@LookbackYear INT
 ,@CurrentSales MONEY
)
RETURNS MONEY
BEGIN

  DECLARE @Diff MONEY

  SELECT @Diff = @CurrentSales - [Sales]
  FROM dbo.CountrySales
  WHERE [CountryName] = @CountryName AND [Year] = @LookbackYear

  RETURN @Diff

END

Где вы можете использовать это так:

SELECT 
  [CountryName]
 ,[Year]
 ,dbo.udf_SalesDiff([CountryName],2015,[Sales]) AS Development
FROM dbo.CountrySales
WHERE [Year]=2017

и будет производить:

CountryName | Year | Development
--------------------------------
Argentina   | 2017 | 12
Florida     | 2017 | -2
Germany     | 2017 | NULL
...