2013-12-16 3 views
1

Просьба проигнорировать, если его самый простой вопрос, поскольку я не очень хорош в SQL и должен разработать запрос i google и не смог получить желаемый результат.GroupBy со счетом на две таблицы

У меня есть две таблицы

Продукт

ProductID, ProductName, Descritpion 
    2010  A   xyz 
    2011  B   uyt 
    2012  C   jkj 

и продаж, как ниже

Sales 
SalesID, ProductID,  SaleDate,  Status 
    1  2010  10-Dec-2013  K 
    2  2010  10-Dec-2013  u 
    3  2011  11-Dec-2013  i 

Я должен разработать запрос, который будет возвращать количество ежедневных продаж, как следующий

ProductName, TotalSaleCount, SaleDate 
    A    2   10-Dec-2013 

Я разрабатываю следующий запрос

SELECT productid, 
     Count(1) 
FROM sales 
WHERE saledate = Trunc(sysdate - 1) 
GROUP BY productid 

выше запрос обратного ProductID с графом, но я хочу ProductName со счетом так, как я присоединюсь таблица продаж с продуктом?

С уважением

ответ

1

Вот несколько иной ответ, чем существующие;

SELECT Product.ProductName, TotalSales.TotalSaleCount, TotalSales.SaleDate 
FROM Product 
JOIN (SELECT ProductId, SaleDate, COUNT(*) as TotalSaleCount 
     FROM Sales 
     GROUP BY ProductId, SaleDate) TotalSales 
    ON TotalSales.ProductId = Product.id 

Результаты должны быть идентичны некоторым из существующих ответов.
, эта версия Вероятно, (но не гарантируется), чтобы быть быстрее - для выбранных столбцов более вероятны индексы на них, а также для лучшего выбора индексов; ProductName обычно не хороший столбец, который можно поставить в качестве начала этого типа индекса, и (в зависимости от того, насколько интеллектуальным является оптимизатор на самом деле), поскольку он не является частью Sales, менее полезен для оптимизатора.

+0

Я пробовал, но результат не сильно улучшен, что я заменяю следующую строку ON TotalSales.ProductId = Productid с использованием (Productid) – ImranRazaKhan

+0

Я надеюсь, что это было 'Product_dot_Id' в соединении, или это будет перекрестное соединение, которое это не то, что вы хотите. 'USING (...)' на самом деле просто синтаксический сахар для регулярного соединения, нет причин, по которым это должно быть улучшением. Я полагаю, что это тоже зависит от MySQL, и его следует избегать в пользу стандартного условия «ON». –

1

Просто присоединиться на Product таблице:

SELECT productname, COUNT(*) 
FROM  Sales 
JOIN  Product ON Sales.productid = Product.producyid 
WHERE saledate = TRUNC(SYSDATE - 1) 
GROUP BY ProductName 
+0

в группе по i упоминание sales.productid или product.product.id? как он бросает следующую ошибку ORA-00918: столбец неоднозначно определен 00918. 00000 - «столбец неоднозначно определен» – ImranRazaKhan

+0

Список 'GROUP BY' должен соответствовать списку' SELECT'. Предполагалось, что это «GROUP BY ProductName». Я исправил свой ответ, спасибо, что указал на проблему. – Mureinik

1

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

select t1.PRODUCTNAME,count(t1.PRODUCTNAME) as TotalSaleCount,t2.SALEDATE from Product t1 , Sales t2 
where t1.ProductID = t2.ProductID AND saledate = TRUNC(SYSDATE - 1) 
GROUP BY t2.SALEDATE,t1.PRODUCTNAME; 
Смежные вопросы