2016-12-22 2 views
0

Вот мои таблицы:Есть ли способ суммировать произведение двух столбцов в MySQL?

-- receipts 
| id | date  | 
|----|------------| 
| 1 | 2016-12-20 | 
| 2 | 2016-12-20 | 
| 3 | 2016-12-21 | 

-- purchases 
| id | receipt_id | item  | price | tax_rate | 
|----|------------|-------------|-------|----------| 
| 1 | 1   | apples  | 3.89 | 0.000 | 
| 2 | 1   | canned soup | 2.99 | 0.095 | 
| 3 | 1   | candy bar | 0.99 | 0.095 | 
| 4 | 2   | gas   | 26.78 | 0.000 | 
| 5 | 3   | chips  | 3.99 | 0.095 | 
| 6 | 3   | dip   | 2.99 | 0.095 | 

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

SELECT 
    receipts.id, 
    receipts.date, 
    SUM(purchases.price) AS subtotal, 
    SUM(purchases.price * purchases.tax_rate) AS tax, 
    SUM(subtotal + tax_rate) 
FROM receipts 
RIGHT JOIN purchases ON purchases.receipt_id = receipts.id; 

Конечный результат должен выглядеть следующим образом:

| id | date  | subtotal | tax | total | 
|----|------------|----------|------|-------| 
| 1 | 2016-12-20 | 7.87 | 0.38 | 8.25 | 
| 2 | 2016-12-20 | 26.78 | 0.00 | 26.78 | 
| 3 | 2016-12-21 | 6.98 | 0.66 | 7.64 | 
+1

Какая у вас проблема? – shmosel

+0

'SUM (subtotal + tax)' дает мне и ошибку, что говорит 'Unknown column 'subtotal' in 'field list'' Если я удалю тот, который у меня получается, я не получаю никаких ошибок, но он просто возвращает первую строку и суммирует весь столбец в одну строку. – MakPo

+0

Вы не можете ссылаться на псевдоним поля в том же запросе. Вам нужно либо поместить его в подзапрос, либо повторить вычисление этого псевдонима. – Barmar

ответ

1

Это выглядит как дело на INNER JOIN, и вы должны GROUP BY receipt_id , Остальное выглядит прекрасно, за исключением того, что ответил шмосель.

SELECT 
    receipts.id, 
    receipts.date, 
    SUM(purchases.price) AS subtotal, 
    SUM(purchases.price * purchases.tax) AS tax, 
    SUM(purchases.price) + SUM(purchases.price * purchases.tax) AS total 
FROM receipts 
INNER JOIN purchases ON purchases.receipt_id = receipts.id 
GROUP BY receipt_id 

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

+0

«INNER JOIN» работал, но он также работал с «RIGHT JOIN». но не используя псевдонимы и добавляя группу, запустив ее. – MakPo

+0

INNER JOIN - это то, что вы ищете, поскольку это приведет к ошибкам, если вы используете ПРАВИЛЬНОЕ СОЕДИНЕНИЕ и обрабатываете данные дальше в программе. Как правило, не может быть квитанция без покупки и наоборот. INNER JOIN находит только «действительные» записи, имеющие как квитанцию, так и покупку. @MakPo – baao

+0

@baao - как написано прямо сейчас, ваш оператор SQL недействителен, потому что вы не являетесь агрегированием и группировкой по методу receipts.date. [Ответ Калеба Холдейна] (https://stackoverflow.com/a/41292360/1429354) более правилен и лучше объясняет требования к агрегации данных. –

1

SELECT значение третьего должно быть

SUM(purchases.price) + SUM(purchases.price * purchases.tax) AS total 
2

Вы почти находитесь. Поскольку вы хотите агрегировать свои результаты, вам нужно использовать агрегированную функцию SUM (что вы сделали), но когда вы используете SUM, вам нужно указать запрос, как вы хотите агрегировать данные. Вы делаете это, добавляя оператор Group By.

SELECT 
    receipts.id, 
    receipts.date, 
    SUM(purchases.price) AS subtotal, 
    SUM(purchases.price * purchases.tax) AS tax, 
    SUM(purchases.price) + SUM(purchases.price * purchases.tax) AS total 
FROM receipts 
RIGHT JOIN purchases ON purchases.receipt_id = receipts.id; 
GROUP BY receipts.id, receipts.date 
Смежные вопросы