SQL Server Как умножить два запроса
Итак, у меня есть два разных запроса:
Query1
CPT Resource 1 2 3 4 5
2017-06-12 RM1 5.00 5.00 4.00 4.00 2.00
2017-06-12 RM2 3.00 6.00 4.00 7.00 4.00
2017-06-12 RM3 3.00 4.00 6.00 8.00 6.00
2017-06-13 RM1 3.00 7.00 5.00 3.00 5.00
2017-06-13 RM2 4.00 5.00 4.00 2.00 4.00
2017-06-13 RM3 2.00 4.00 5.00 2.00 7.00
2017-06-14 RM1 2.00 4.00 6.00 4.00 2.00
2017-06-14 RM2 6.00 5.00 4.00 5.00 2.00
2017-06-14 RM3 5.00 3.00 7.00 4.00 5.00
а также
Query2
CPT Resource 1 2 3 4 5
2017-06-12 RM1 0.00 -2.00 0.00 0.00 -2.00
2017-06-12 RM2 -3.00 -3.00 0.00 0.00 0.00
2017-06-12 RM3 -1.00 -3.00 0.00 0.00 0.00
2017-06-13 RM1 0.00 -1.00 0.00 0.00 0.00
2017-06-13 RM2 0.00 -1.00 -1.00 -2.00 -2.00
2017-06-13 RM3 -2.00 -3.00 -1.00 0.00 0.00
2017-06-14 RM1 0.00 0.00 0.00 0.00 0.00
2017-06-14 RM2 0.00 -4.00 -3.00 -2.00 0.00
2017-06-14 RM3 0.00 -3.00 -1.00 0.00 -2.00
С этими двумя запросами, как мне создать новый запрос, который умножает данные из query1 на соответствующее число в запросе 2, которое находится в той же позиции на основе этой даты, ресурса и часа (которые являются заголовками 1, 2, 3, 4 и 5). Я также хочу только положительные числа, поэтому новые данные должны быть умножены на -1.
Если я сделаю это вручную, новая таблица должна выглядеть так:
Query3
CPT Resource 1 2 3 4 5
2017-06-12 RM1 0.00 10.00 0.00 0.00 4.00
2017-06-12 RM2 9.00 18.00 0.00 0.00 0.00
2017-06-12 RM3 3.00 12.00 0.00 0.00 0.00
2017-06-13 RM1 0.00 7.00 0.00 0.00 0.00
2017-06-13 RM2 0.00 5.00 4.00 4.00 8.00
2017-06-13 RM3 4.00 12.00 5.00 0.00 0.00
2017-06-14 RM1 0.00 0.00 0.00 0.00 0.00
2017-06-14 RM2 0.00 20.00 12.00 10.00 0.00
2017-06-14 RM3 0.00 9.00 7.00 0.00 10.00
6 ответов
Просто присоединитесь к ключевому полю и используйте ABS()
вернуть положительный результат.
SELECT Q1.CPT,
Q1.Resource,
ABS(Q1.[1] * Q2.[1]) as [1],
ABS(Q1.[2] * Q2.[2]) as [2],
ABS(Q1.[3] * Q2.[3]) as [3],
ABS(Q1.[4] * Q2.[4]) as [4],
ABS(Q1.[5] * Q2.[5]) as [5]
FROM Query1 Q1
JOIN Query2 Q2
ON Q1.CPT = Q2.CPT
AND Q1.Resourece = Q2.Resource
Вы можете использовать простое соединение, как показано ниже
Select q1.CPT, q1.[Resource]
, [1] = abs(q1.[1]*q2.[1])
, [2] = abs(q1.[2]*q2.[2])
, [3] = abs(q1.[3]*q2.[3])
, [4] = abs(q1.[4]*q2.[4])
, [5] = abs(q1.[5]*q2.[5])
from Query1 q1
join Query2 q2
on q1.CPT = q2.CPT
and q1.[Resource] = q2.[Resource]
замените query1 и 2 вашим подзапросом, если требуется
SELECT a.CPT
, a.Resource
, ABS(a.Col1 * b.Col1) AS 'Col1'
, ABS(a.Col2 * b.Col2) AS 'Col2'
, ABS(a.Col3 * b.Col3) AS 'Col3'
, ABS(a.Col4 * b.Col4) AS 'Col4'
, ABS(a.Col5 * b.Col5) AS 'Col5'
FROM Query1 AS a
INNER JOIN Query2 AS b ON (a.CPT = b.CPT AND a.Resource = b.Resource)
select Query1.CPT
, Query1.Resource
, Query1.1 * Query2.1 as 1
, Query1.2 * Query2.2 as 2
, Query1.3 * Query2.3 as 3
, Query1.4 * Query2.4 as 4
, Query1.5 * Query2.5 as 5
from Query1
Join Query2 on Query1.Resource= Query2.Resource
Попробуйте вот так, у меня нет сервера sql прямо сейчас, чтобы попробовать это самому, вам может потребоваться внести некоторые изменения в запрос.
Для отрицательных значений вы можете использовать следующий запрос отдельно или встраивать его в основной запрос.
update NewTableName field = field * -1 where field < 0
Предполагая, что у вас есть две рассматриваемые таблицы как t1 и t2, тогда ваш запрос должен быть
select
t1.CPT,
t1.resource,
ABS(t1.[1]*t2.[1]) as [1],
ABS(t1.[2]*t2.[2]) as [2],
ABS(t1.[3]*t2.[3]) as [3],
ABS(t1.[4]*t2.[4]) as [4],
ABS(t1.[5]*t2.[5]) as [5]
from
t1 join t2
on t1.CPT=t2.CPt
and t1.resource=t2.resource
Если у вас нет таблиц t1 и t2, это результаты вашего запроса; пожалуйста, инкапсулируйте ваши запросы как подзапрос с псевдонимами t1 и t2
select
t1.CPT,
t1.resource,
ABS(t1.[1]*t2.[1]) as [1],
ABS(t1.[2]*t2.[2]) as [2],
ABS(t1.[3]*t2.[3]) as [3],
ABS(t1.[4]*t2.[4]) as [4],
ABS(t1.[5]*t2.[5]) as [5]
from
--( your query 1)
t1 join
--( your query 2)
t2
on t1.CPT=t2.CPt
and t1.resource=t2.resource
Вам нужно присоединиться к CPT и Resource, возвращая table1.1 * table2.1 как 1, вот так:
SELECT t1.1 * t2.1 as 1 from t1 join t2 on t1.CPT = t2.CPT and t1.Resource = t2.Resource