2009-11-23 6 views
0

Возникли проблемы с этим запросом. Записи возвращаются, но не сгруппированы через product_id, который я хочу. Если я удалю другие поля из группы по параметру, тогда я получу поле ошибки, не содержащееся в функции group или aggregate.sql question question

Спасибо за помощь

SELECT 
    o.Product_ID, i.producttitle, i.URLimage,i.price, 
    i.customfield2, i.season, i.active, i.discontinued, 
    i.opttitle1, i.opttitle2, i.opttitle3, 
     SUM(CASE WHEN processdate BETWEEN '2009-08-01 00:00:00.000' 
       AND '2009-10-31 23:59:00.000' 
      THEN o.sprice ELSE 0 END) AS totalprice_date1, 
     SUM(CASE WHEN processdate BETWEEN '2009-11-01 00:00:00.000' 
       AND '2009-12-31 23:59:00.000' 
      THEN o.sprice ELSE 0 END) AS totalprice_date2, 
     SUM(CASE WHEN processdate BETWEEN '2009-08-01 00:00:00.000' 
       AND '2009-10-31 23:59:00.000' 
      THEN o.Qty ELSE 0 END) AS qtysold_date1, 
     SUM(CASE WHEN processdate BETWEEN '2009-11-01 00:00:00.000' 
       AND '2009-12-31 23:59:00.000' 
      THEN o.Qty ELSE 0 END) AS qtysold_date2 
    FROM dbo.getskusold o 
     inner join imagereport i 
      on o.product_id = i.product_id 
    GROUP BY o.Product_ID, i.producttitle, i.URLimage, 
     i.price, i.customfield2, i.season, 
     i.active, i.discontinued, i.opttitle1, 
     i.opttitle2, i.opttitle3 
+1

Ваш SQL выглядит корректно. Что вы подразумеваете под словом «они не сгруппированы по product_id»?Не могли бы вы предоставить образец вывода (а), что вы получите, и (б), что вы хотели бы получить? – Heinzi

+0

Его возврат одного и того же продукта более одного раза, когда он должен сочетать продукт, если он имеет тот же product_id. – jeff

+0

Он будет возвращать строку для каждого результата соединения между dbo.getskusold и imagereport ... не уникальную строку для каждого product_id. –

ответ

3

Если это SQL Server, группировка на основе всех полей, перечисленных в группе по статье, так что если какой-либо из других полей для того же PRODUCT_ID различны, они будут классифицированы как отдельные строки.

Вы либо прекращаете вывод полей, которые являются разными, либо выбирают для их объединения, и укажите, какое из нескольких значений вы хотите (min, max и т. Д.), Когда есть дубликаты.

+0

Этот совет также применим к Oracle и, Я подозреваю, большинство других РСУБД. – APC

+0

MySQL - это единственное, что я знаю о том, что у меня другое поведение, по дизайну я боюсь: http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-columns.html –

0

Если вы хотите, чтобы результаты были сгруппированы только Product_ID, удалите другие имена полей из вашего предложения GROUP BY. Если вы это сделаете, вам также нужно будет удалить те же имена полей из списка SELECT (или объединить имена полей с одной функцией агрегата, например MAX, MIN, SUM, AVG). Если вам все еще нужны эти столбцы, вы можете сделать еще один JOIN в исходную таблицу для этих столбцов для вашего запроса в виде вложенного подзапроса.

-1

Поскольку вы не выполняете какую-либо группу агрегации, это просто косвенный способ контроля порядка (и в этом он не является надежным, поскольку это не то, для чего оно предназначено).

Если вы хотите вернуть только один идентификатор продукта, вы должны либо скомпилировать его в других полях, либо добавить предложение в оператор where, который сообщает базе данных ТОЧНО, какую единственную запись вы хотите вернуть.

+0

Существуют поля, использующие SUM - который является агрегатной функцией – Mark

0

Я думаю, что это то, что вы хотите ... Если нет, тогда вам нужно объяснить больше о ожидаемом выходе. ПРИМЕЧАНИЕ в сервере ms 2005+ быстрее выполнить CTE, чтобы получить итоговые суммы, а затем сделать ссылку на таблицу imagereport. - или используйте временную таблицу.

SELECT getskusold.Product_ID, 
    max(imagereport.producttitle), 
    max(imagereport.URLimage), 
    max(imagereport.price), 
    max(imagereport.customfield2), 
    max(imagereport.season), 
    max(imagereport.active), 
    max(imagereport.discontinued), 
    max(imagereport.opttitle1), 
    max(imagereport.opttitle2), 
    max(imagereport.opttitle3), 

SUM(CASE WHEN processdate BETWEEN '2009-08-01 00:00:00.000' AND '2009-10-31 23:59:00.000' THEN getskusold.sprice ELSE 0 END) AS totalprice_date1, 
SUM(CASE WHEN processdate BETWEEN '2009-11-01 00:00:00.000' AND '2009-12-31 23:59:00.000' THEN getskusold.sprice ELSE 0 END) AS totalprice_date2, 
SUM(CASE WHEN processdate BETWEEN '2009-08-01 00:00:00.000' AND '2009-10-31 23:59:00.000' THEN getskusold.Qty ELSE 0 END) AS qtysold_date1, 
SUM(CASE WHEN processdate BETWEEN '2009-11-01 00:00:00.000' AND '2009-12-31 23:59:00.000' THEN getskusold.Qty ELSE 0 END) AS qtysold_date2 

FROM dbo.getskusold 
inner join imagereport 
on getskusold.product_id = imagereport.product_id 

GROUP BY getskusold.Product_ID 
0

Вы «Группировка по» всем полям в группе по статье, если вы хотите группы ONl, у продукта Id, то это только один, который должен быть в группе К статье. Тогда все остальные столбцы в Select необходимости выводиться с помощью какой-то агрегатной функции (линия Min, Max, Avg, и т.д ...)

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

SELECT o.Product_ID, 
    Min(i.producttitle) MinTitle, Min(i.URLimage) MinImage, 
    Min(i.price) MinPrice, Min(i.customfield2) MinCustom, 
    Min(i.season) MinSeaason, Min(i.active) MinActive, 
    Min(i.discontinued) MinDiscontinued, 
    Min(i.opttitle1) MinOptTitle1, Min(i.opttitle2) MinOptTitle2, 
    Min(i.opttitle3) MinOptTitle3, 
     SUM(CASE WHEN processdate BETWEEN '2009-08-01 00:00:00.000' 
       AND '2009-10-31 23:59:00.000' 
      THEN o.sprice ELSE 0 END) AS totalprice_date1, 
     SUM(CASE WHEN processdate BETWEEN '2009-11-01 00:00:00.000' 
       AND '2009-12-31 23:59:00.000' 
      THEN o.sprice ELSE 0 END) AS totalprice_date2, 
     SUM(CASE WHEN processdate BETWEEN '2009-08-01 00:00:00.000' 
       AND '2009-10-31 23:59:00.000' 
      THEN o.Qty ELSE 0 END) AS qtysold_date1, 
     SUM(CASE WHEN processdate BETWEEN '2009-11-01 00:00:00.000' 
       AND '2009-12-31 23:59:00.000' 
      THEN o.Qty ELSE 0 END) AS qtysold_date2 
    FROM dbo.getskusold o 
     inner join imagereport i 
      on o.product_id = i.product_id 
    GROUP BY o.Product_ID 

или, лучше, (потому что это понятнее), генерирует совокупные результирующую первым, а затем присоединиться к фото таблицы:

Select z.ProductId, i.producttitle, 
    i.URLimage, i.price, i.customfield2, 
    i.season, i.active, i.discontinued,  
    i.opttitle1, i.opttitle2, i.opttitle3, 
    z.totalprice_date1, z.qtysold_date1, 
    z.totalprice_date2, z.qtysold_date2 
From 
    (Select Product_ID ProductId, 
     Sum(CASE WHEN processdate BETWEEN '2009-08-01 00:00:00.000' 
       AND '2009-10-31 23:59:00.000' 
      THEN sprice ELSE 0 END) AS totalprice_date1, 
     Sum(CASE WHEN processdate BETWEEN '2009-11-01 00:00:00.000' 
       AND '2009-12-31 23:59:00.000' 
      THEN sprice ELSE 0 END) AS totalprice_date2, 
     Sum(CASE WHEN processdate BETWEEN '2009-08-01 00:00:00.000' 
       AND '2009-10-31 23:59:00.000' 
      THEN Qty ELSE 0 END) AS qtysold_date1, 
     Sum(CASE WHEN processdate BETWEEN '2009-11-01 00:00:00.000' 
       AND '2009-12-31 23:59:00.000' 
      THEN Qty ELSE 0 END) AS qtysold_date2 
    From dbo.getskusold 
    Group By Product_ID) Z 
     Join imagereport i 
      on i.product_id = Z.Productid 
0

Из моего опыта много строк, которые связывают с конкретным продуктом Id и запрос не будут знать, какие строки, чтобы вернуться, но у меня есть частичное решение.

Взгляните на это:

select (select top 1 [Name] from Product), SupplierID 
from Product 
group by SupplierID 

SupplierID является внешним ключом и имеет несколько значений. Я просил модуль sql выбрать первую строку каждой группы. Я так работаю. Если вы хотите объединить строки, проверьте this.