2016-04-19 2 views
0

В основном я пытаюсь переместить существующие объекты из одного регистра в другой, вычитая из исходной точки и добавляя ее к судьбе. У меня есть одна таблица «акции», как это:Самый простой способ вычесть в одном столбце и добавить в другое

страна город стоимость

AA  01 500 
AA  02 400 
BB  01 300 
CC  01 100 
CC  02 1000 
CC  03 2000 

И я получаю документ о «движений» со структурой, как это:
количество originCountry originCity endCountry endCity

10  AA    01   CC   01 
20  AA    01   BB   02 
50  BB    01   CC   03 

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

Редактировать

Ответ должен быть таким:

количество originCountry originCity endCountry endCity

AA  01 470 
AA  02 400 
BB  01 250 
CC  01 110 
CC  02 1020 
CC  03 2050 

отрицательные числа и бизнес-правила не относятся

+0

Редактировать свой вопрос и указать, каким должен быть результат. –

+0

Если я понимаю, о чем вы спрашиваете, это станет 2 операциями обновления. один для вычитания значения из строки начала, а другой для добавления значения в строку назначения. вам нужно будет учитывать возможности, которые ни одна из этих строк не существует, или что вы идете ниже 0 или каких-либо других бизнес-правил. – Randy

+0

Я обновил вопрос, добавив ожидаемый ответ – zerg

ответ

0

попробовать это (IsNull для TSQL):

SELECT country, city, value - isnull(p, 0) + isnull(m, 0) as q 
FROM Stocks AS s 
LEFT JOIN (SELECT originCountry, originCity, Sum(quantity) m FROM movements GROUP BY originCountry, originCity) AS mm 
    ON originCountry = s.country AND originCity = s.city 
LEFT JOIN (SELECT endCountry, endCity, Sum(quantity) p FROM movements GROUP BY endCountry, endCity) AS mp ON 
    ON endCountry = s.country AND endCity = s.city 

Для MS ACCESS (добавить тег в следующий раз ...):
это должно работой:

SELECT country, city, value - Nz(p, 0) + Nz(m, 0) as q 
FROM ((Stocks AS s 
LEFT JOIN (SELECT originCountry, originCity, Sum(quantity) m FROM movements GROUP BY originCountry, originCity) AS mm 
    ON (originCountry = s.country AND originCity = s.city)) 
LEFT JOIN (SELECT endCountry, endCity, Sum(quantity) p FROM movements GROUP BY endCountry, endCity) AS mp ON 
    ON (endCountry = s.country AND endCity = s.city)) 

или этого ((если вы получите ошибку, используйте функцию DSum):

SELECT country, city, value 
    - Nz((
    SELECT Sum(quantity) m 
    FROM movements 
    WHERE originCountry = s.country AND originCity = s.city 
), 0) + Nz((
    SELECT Sum(quantity) p 
    FROM movements 
    WHERE endCountry = s.country AND endCity = s.city 
), 0) as q 
FROM Stocks AS s 
+0

для mysql использовать 'ifnull', для oracle' nvl' –

+0

извините за то, что я так noob. Я получаю сообщение об ошибке в соединении, Как я должен связать таблицы? страна с originCountry и endCountry, город с городом происхождения и endCity? – zerg

+0

1 Какие dbms вы используете? 2 Какую ошибку вы получите? Отношения определяются в условиях «ВКЛ». –