Вычисление соотношения между двумя одинаковыми столбцами таблицы в SQL Server - PullRequest
0 голосов
/ 16 января 2019

У меня есть эта таблица

Code1   Month1   Month2   Month3 
--------------------------------
Delta    2000     3000     1000
Charlie  1000     1000     2000
Bravo     800      200      300

и у меня есть другая похожая временная таблица с данными из другого аспекта расчета

Code1     Month1  Month2  Month3 
--------------------------------
Delta      1000    3000   3000
Charlie     300     400    200
Bravo       400     200    300

Мне было интересно, как я могу объединить данные из обеих таблиц в одну в следующем формате

Code1      Month1  Month2  Month3 
---------------------------------
Delta   2      ........
Charlie 3.3    ...
Bravo   2      ....

Что в основном соответствует строкам, а затем выполняется 1-й столбец таблицы / 2-й столбец таблицы.

Грубый подход, который я имею, состоит в том, чтобы просто объединить таблицу в одну большую таблицу, а затем создать другую временную таблицу, разделив объединенные столбцы, но мне было интересно, есть ли лучший подход.

Спасибо

Ответы [ 4 ]

0 голосов
/ 16 января 2019

UNION объединяет строки, так что это то, что вам нужно, чтобы расположить одну таблицу поверх другой, но соединяет стеки столбцов друг с другом

SELECT * FROM Table1
UNION ALL
SELECT * FROM Table2
0 голосов
/ 16 января 2019

Вот что я придумал, основываясь на этой ссылке разделить столбец из одной таблицы в столбец из другой таблицы

SELECT ISNULL(T1.Code,T2.Code) AS Code
          , CASE WHEN ISNULL(T1.Month1,0) = 0 THEN ISNULL(T2.Month1,0)
                 ELSE ISNULL(T2.Month1,0)/ISNULL(T1.Month1,0)
              END AS Month1,
              CASE WHEN ISNULL(T1.Month2,0) = 0 THEN ISNULL(T2.Month2,0)
                 ELSE ISNULL(T2.Month2,0)/ISNULL(T1.Month2,0)
              END AS Month2,
              CASE WHEN ISNULL(T1.Month3,0) = 0 THEN ISNULL(T2.Month3,0)
                 ELSE ISNULL(T2.Month3,0)/ISNULL(T1.Month3,0)
              END AS Month3
       FROM #TempBidCost AS T1
  FULL JOIN #TempBidRevenue AS T2 ON T1.Code = T2.Code
0 голосов
/ 16 января 2019

Если у вас есть все совпадающие строки, то inner join хорошо.Я бы не стал рекомендовать full outer join, если вам небезразличны несоответствия.Вместо этого union all обеспечивает подход:

select code1,
       sum(month1) / nullif(sum(month1_2), 0) as ratio_1,
       sum(month2) / nullif(sum(month2_2), 0) as ratio_1,
       sum(month3) / nullif(sum(month3_2), 0) as ratio_1,
from ((select t1.code1, month1, month2, month3
       from t1
      ) union all
      (select t2.code1, null, null, null, t2.month1 as month1_2, t2.month2 as month2_2, t2.month3 as month3_2
       from t2
      )
     ) t
group by code1;
0 голосов
/ 16 января 2019

вы можете использовать внутреннее соединение

select 
  t1.Code1, 
  (t1.month1 * 1.0) / t2.month1 as month1,
  (t1.month2 * 1.0) / t2.month2 as month2,
  (t1.month3 * 1.0) / t2.month3 as month3
from t1
inner join t2 on t1.code1 = t2.code1

Обратите внимание:

Из предоставленных образцов данных, похоже, нет необходимости полного внешнего соединения. Если данные от 1 до 1, лучше использовать внутреннее соединение для оценки производительности

...