Вычитание двух строк из одной таблицы на основе даты и часа

У меня есть два стола, к которым я хотел бы присоединиться.

Таблица А

  Date     | Hour | Direction | Qty 
2018-11-20    1      DE/UK       2 
2018-11-20    2      DE/UK       6 

Таблица Б

   Date    | Hour | Area  | Price
2018-11-20    1      DE       5 
2018-11-20    2      DE       4 
2018-11-20    1      UK       3 
2018-11-20    2      UK       9 

Я хочу присоединиться к ним следующим образом:

Таблица С

 Date     | Hour | Direction | Qty | AreaFrom | AreaTo | PriceFrom | PriceTo | Profit
2018-11-20    1      DE/UK       2      DE       UK         5           3      3-5 = -2
2018-11-20    2      DE/UK       6      DE       UK         4           9        5

Я пробовал CROSS Join и другие виды соединений, но не смог заставить его работать.

Другие связанные вопросы, на которые я смотрел до сих пор:

SQL вычитает две строки на основе даты и другого столбца

Выбор двух строк из одной таблицы


person milanDD    schedule 26.11.2018    source источник
comment
Пожалуйста, отметьте свой вопрос с помощью базы данных, которую вы используете.   -  person Gordon Linoff    schedule 26.11.2018
comment
Вы будете искать pivot свою площадь и столбцы цен соответственно из таблицы b. Затем присоединитесь к дате/часу обратно к таблице A.   -  person Adam    schedule 26.11.2018


Ответы (1)


Возможно, это не так сложно, как изображает Адам. Если бы в таблице A были столбцы «directionFrom» и «directionTo», вы, вероятно, решили бы это самостоятельно. Итак, давайте разделим поле направления на два столбца:

SELECT 
  a.[Date], a.[Hour], a.Direction, a.Qty, 
  f.Area as AreaFrom, t.Area as AreaTo, 
  f.Price as priceFrom, t.Price as PriceTo, 
  t.Price-f.Price as profit
FROM 
  TableA a
  INNER JOIN TableB f 
  ON 
    a.[Date] = f.[Date] and 
    a.Hour = b.[Hour] and
    LEFT(a.Direction, 2) = f.Area --take the left two as the area from
  INNER JOIN TableB t 
  ON 
    a.[Date] = t.[Date] and 
    a.Hour = t.[Hour] and
    RIGHT(a.Direction, 2) = t.Area --take the right two as the area to

Если у вас когда-либо будут области с более чем двухбуквенными кодами, вам придется вместо этого использовать ПОДСТРОКУ в CHARINDEX символа /.

person Caius Jard    schedule 26.11.2018