Вы, кажется, хотите rd
подзапрос вернуть одну строку, в среднем в течение определенного периода времени. Таким образом, удалить group by
и положить в соответствующих границах с использованием where
:
SELECT sm.sinvoiceno, sm.sinvoicedate, sm.pureweight, sm.makingcharge, sm.totalamount,
rd.avgr, (sm.pureweight*rd.avgr) + sm.makingcharge AS TotalCost ,
sm.totalamount-((sm.pureweight*rd.avgr)+sm.makingcharge) AS Profit
FROM sales_master sm CROSS JOIN
(SELECT AVG(goldrate24) AS AvgR
FROM rate_detail r
WHERE grDate = '2014-12-30'
) rd
WHERE sm.sinvoicedate = '2014-12-30';
Вы можете поставить диапазон, чтобы расширить временный период в среднем. Например:
SELECT sm.sinvoiceno, sm.sinvoicedate, sm.pureweight, sm.makingcharge, sm.totalamount,
rd.avgr, (sm.pureweight*rd.avgr) + sm.makingcharge AS TotalCost ,
sm.totalamount-((sm.pureweight*rd.avgr)+sm.makingcharge) AS Profit
FROM sales_master sm CROSS JOIN
(SELECT AVG(goldrate24) AS AvgR
FROM rate_detail r
WHERE grDate BETWEEN '2014-12-30' AND '2015-01-02'
) rd
WHERE s.invoiceDate BETWEEN '2014-12-30' AND '2015-01-02';
EDIT:
Это происходит со мной, что вы хотите, в среднем на одну дату, которая является датой счета-фактуры. В этом случае:
SELECT sm.sinvoiceno, sm.sinvoicedate, sm.pureweight, sm.makingcharge, sm.totalamount,
rd.avgr, (sm.pureweight*rd.avgr) + sm.makingcharge AS TotalCost,
sm.totalamount-((sm.pureweight*rd.avgr)+sm.makingcharge) AS Profit
FROM sales_master sm JOIN
(SELECT date(grDate) as grDate, AVG(goldrate24) AS AvgR
FROM rate_detail r
WHERE BETWEEN '2014-12-30' AND '2015-01-02'
GROUP BY date(grDate)
) rd
ON rd.grDate = sm.s.invoicedate
WHERE s.invoiceDate BETWEEN '2014-12-30' AND '2015-01-02';
Непонятно, имеют ли столбцы «даты» временные компоненты. Если да, тогда вы хотите использовать date()
, где это необходимо.
Пожалуйста, предоставьте вывод, который он дает, и вывод, который вы ожидаете получить. Благодарю. – Mureinik
Вам не хватает условия соединения между подзапросом и таблицей. Если у вас несколько дат, он будет производить полный кросс-продукт. – Barmar
Не используйте старый синтаксис соединения, используйте ключевое слово 'ON'. Кроме того, не используйте 'between' (http://sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/what-do-between-and-the-devil-have-in-common.aspx) – HoneyBadger