2015-01-02 2 views
0

Мой запрос предназначен для расчета прибыли от продаж. Чтобы рассчитать себестоимость, мне нужно взять среднюю стоимость за конкретную дату. Ниже запрос работает хорошо, если у меня есть одну дату, но для range of dates(replacing '=2014-12-30 ' with 'BETWEEN '2014-12-30' AND '2015-01-02' at both places) не создает требуемую мощностьПодзапрос MySQL между датой

SELECT sinvoiceno,sinvoicedate,pureweight,makingcharge,totalamount,rd.avgr , 
    (pureweight*rd.avgr)+makingcharge AS TotalCost , 
    totalamount-((pureweight*rd.avgr)+makingcharge) AS Profit 
FROM 
    (SELECT DATE_FORMAT(gdate,'%Y-%m-%d') AS grDate,AVG(goldrate24) AS AvgR 
    FROM rate_detail r 
    GROUP BY grDate 
    HAVING grdate = '2014-12-30') AS rd, 
    sales_master sm 
WHERE sinvoicedate = '2014-12-30' 
+2

Пожалуйста, предоставьте вывод, который он дает, и вывод, который вы ожидаете получить. Благодарю. – Mureinik

+0

Вам не хватает условия соединения между подзапросом и таблицей. Если у вас несколько дат, он будет производить полный кросс-продукт. – Barmar

+0

Не используйте старый синтаксис соединения, используйте ключевое слово 'ON'. Кроме того, не используйте 'between' (http://sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/what-do-between-and-the-devil-have-in-common.aspx) – HoneyBadger

ответ

0

Вам нужно условие соединения, так что вы связываете строки подзапроса с sales_master на том же Дата.

SELECT sinvoiceno,sinvoicedate,pureweight,makingcharge,totalamount,rd.avgr , 
    (pureweight*rd.avgr)+makingcharge AS TotalCost , 
    totalamount-((pureweight*rd.avgr)+makingcharge) AS Profit 
FROM 
    (SELECT DATE(gDate) AS grDate, AVG(goldrate24) AS AvgR 
    FROM rate_detail r 
    WHERE DATE(gDate) BETWEEN '2014-12-30' AND '2015-01-02' 
    GROUP BY grDate) AS rd 
JOIN sales_master sm ON sinvoicedate = grDate 
WHERE sinvoicedate BETWEEN '2014-12-30' AND '2015-01-02' 
+0

Спасибо всем, что я получил свою ошибку, на сегодняшний день формат должен быть одного типа. Все, что я сделал, я делаю обе даты в том же формате, и это сработало. –

0

Попробуйте это:

SELECT sinvoiceno, sinvoicedate, pureweight, makingcharge, 
     totalamount, rd.avgr, (pureweight * rd.avgr) + makingcharge AS TotalCost , 
     totalamount -((pureweight * rd.avgr) + makingcharge) AS Profit 
FROM (SELECT STR_TO_DATE(gdate,'%Y-%m-%d') AS grDate,AVG(goldrate24) AS AvgR 
     FROM rate_detail r 
     WHERE STR_TO_DATE(gdate,'%Y-%m-%d') BETWEEN '2014-12-30' AND '2015-01-02' 
     GROUP BY grDate 
    ) AS rd, 
INNER JOIN sales_master sm ON rd.grDate = sinvoicedate 
WHERE sinvoicedate BETWEEN '2014-12-30' AND '2015-01-02'; 
0

Вы, кажется, хотите 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(), где это необходимо.

Смежные вопросы