Вычтите два столбца из двух разных таблиц подряд - PullRequest
0 голосов
/ 27 июня 2019

У меня есть две таблицы, twentyBuyer и twentySeller, и в обеих таблицах у меня есть несколько столбцов, но я хочу вытащить это totalCost. Я пытался найти способ сделать так, чтобы я мог последовательно вычесть twentyBuyer.totalCost из twentySeller.totalCost. Таблицы, как показано ниже.

ТАБЛИЦА Твиттер

ID, Date,        Name,   TotalCost, Type
1,  "today",     "John", 46,        "ONE"
2,  "yesterday", "Doe",  506,       "ONE"

ТАБЛИЦА двадцать продавцов

ID, Date,        Name,     TotalCost, TYPE
1,  "today",     "Franko", 273,       "ONE"
2,  "yesterday", "Bob",    207,       "ONE"

Сначала я попытался получить информацию, используя операторы SELECT, чтобы я мог очень легко выполнить вычитание, выполнив SELECT twentyBuyer.totalCost - twenty_seller.totalCost FROM twentyBuyer, twenty_seller;, к которому я получил

diff
299
-161
233
-227

Я думал, что этот путь был неправильным, поэтому я гуглил некоторые и наткнулся на соединения. Когда я начал использовать INNER JOIN, я почти получил правильные результаты, но было еще два результата

КОД:

SELECT DISTINCT twenty_seller.totalCost, twentyBuyer.totalCost
FROM twenty_seller
LEFt OUTER JOIN twentyBuyer
ON 1=1;


totalCost | totalCost
207       | 506
273       | 506
207       | 46
273       | 46 

Я пытался добавить к нему УНИКАЛЬНОЕ, но ничего не получалось. Затем я переключился на представления, но у меня были похожие проблемы. Я удалил код представлений, но столкнулся с похожими проблемами.

Я хочу, чтобы результаты были как

difference
-227
299 

Я прошу прощения, если это тривиальный вопрос, но я просто не могу понять, как это сделать, и я думаю, что есть простое решение, о котором я пока не могу придумать. Любая помощь приветствуется

Ответы [ 2 ]

0 голосов
/ 27 июня 2019

Вы ищете предложение "AS" с добавлением математики.

Вы также не предоставляете ему ни одного столбца для сопоставления, что означает, что ВСЕ строки из ОБОИХ таблиц будут возвращены как есть.

Вы можете исправить это, указав соответствующий столбец.

Вот так:

SELECT 
  twenty_seller.totalCost AS 'cost1',
  twentyBuyer.totalCost AS 'cost2',
  twenty_seller.totalCost-twentyBuyer.totalCost AS 'Difference'
FROM twenty_seller
LEFT OUTER JOIN twentyBuyer ON twenty_seller.ID=twentyBuyer.ID; 

Или, если вы просто хотите разницу:

SELECT 
  twenty_seller.totalCost-twentyBuyer.totalCost AS 'Difference'
FROM twenty_seller
LEFT OUTER JOIN twentyBuyer ON twenty_seller.ID=twentyBuyer.ID; 

И если вы хотите получить сумму по всем строкам:

SELECT 
  SUM(twenty_seller.totalCost)-SUM(twentyBuyer.totalCost) AS 'Difference'
FROM twenty_seller
LEFT OUTER JOIN twentyBuyer ON twenty_seller.ID=twentyBuyer.ID;
0 голосов
/ 27 июня 2019

База данных не пытается сопоставить строки из двух таблиц - она ​​выполняет декартово произведение (т. Е. Сопоставляет каждую строку в первой таблице с каждой строкой второй таблицы), и вы должны предоставить условие сообщая базе данных, как объединить эти строки.

В первом примере у вас нет условия, поэтому вы получаете 2 * 2 = 4 строки. Это называется перекрестным соединением. Во втором примере условие 1 = 1 всегда оценивается как истинное, поэтому, хотя оно ему не нравится, оно также является перекрестным соединением и дает те же результаты, что и первый запрос.

Предполагая, что вы хотите сопоставить строки с одинаковыми идентификаторами, вы должны предоставить эту логику в качестве условия:

SELECT td.id, ts.totalCost - tb.totalCost
FROM   twenty_seller ts
JOIN   twentyBuyer tb ON ts.id = tb.id;
...