2014-01-09 2 views
-2

У меня есть рабочий запрос для строк заказа, которые включают определенный диапазон элементов, затем я присоединяюсь к информации о заказе.GROUP BY в JOIN'ed результирующий набор в MS-SQL

SELECT Orders.*, Orderp.* 
FROM Orders 
INNER JOIN 
    Orderp ON Orderp.StoreID = Orders.StoreID 
    AND 
    Orderp.[Date] = Orders.[Date] 
    AND 
    Orderp.OrderNumber = Orders.OrderNumber 
WHERE 
    (Orders.ItemType = 2) 
    AND 
    (Orders.ItemNumberOnMenu IN (68, 69, 70, 71, 72)) 
    AND 
    (Orders.[Date] > '2013/01/01') 

Если добавить GROUP BY Orderp.Telephone в конце вышеупомянутого запроса, я получаю следующее сообщение об ошибке. enter image description here

Любые идеи, как группировать по номеру телефона клиента?

+0

Вы должны заказать ВСЕ столбцы в talbe 'Orders' и' Orderp', если вы выберете все данные из этих таблиц. –

+0

возможно, группа по заказу.Телефон, а затем Orders.OrdersID? –

+0

Пожалуйста, укажите информацию о поле для таблиц. Вы не можете использовать предложение GROUP BY с выбранным *. Вы должны указать список полей в части SELECT, а столбцы, присутствующие в предложении SELECT, должны быть частью предложения GROUP BY, если вы не используете агрегат. –

ответ

5

Давайте попробуем наше самое лучшее, чтобы выправить это для вас.

Вы используете GROUP BY, который обычно сопровождается функцией агрегата. Например, если я хочу, чтобы средние продажи моих продуктов я использовал. GroupBy

SELECT 
    AVG(Sales), 
    ProductID 
FROM MostGenericTable 
GROUP BY ProductID 

Там теперь будет показать мне средний объем продаж для каждого ProductID.

Именно поэтому ваш запрос не работает. Вы группируете только один столбец и не выполняете агрегирование на других.

Вторая проблема, с которой вы имеете дело, - это лениво. Введите столбцы, которые вы хотите получить. Не используйте SELECT *, причины многочисленны, и простой поиск в Google даст вам множество результатов. В вашем конкретном примере это дает вам проблемы, потому что вы даже не знаете, какие столбцы для Group By.

Поскольку вы используете Group By таким образом, возможно, вы действительно ищете ORDER BY, который сортирует набор строк, который возвращается. OrderBy

SELECT 
    Orders.*, 
    Orderp.* 
FROM Orders 
INNER JOIN Orderp 
ON Orderp.StoreID = Orders.StoreID 
    AND Orderp.[Date] = Orders.[Date] 
    AND Orderp.OrderNumber = Orders.OrderNumber 
WHERE (Orders.ItemType = 2) 
    AND (Orders.ItemNumberOnMenu IN (68, 69, 70, 71, 72)) 
    AND (Orders.[Date] > '2013/01/01') 
ORDER BY Orderp.Telephone 

Надеется, что объяснение поможет вам не сделать эти ошибки в будущем.

+0

Очевидно, что я не привык к MSSQL :) Обычно работайте с MySQL, как вы могли догадаться. Я принял ответ от @ Zane -Thanks. Я удалил подстановочные знаки и добавил выбранные поля в GROUP BY - и он работает! – Phliplip

2

Если вы собираетесь GROUP BY телефон, вам необходимо либо агрегат для любого другого поля, или к группе на них также:

SELECT MAX(Orders.col1) col1 
    , MAX(Orders.col2) col2 
    , Orderp.Telephone 
FROM Orders 
INNER JOIN Orderp 
    ON Orderp.StoreID = Orders.StoreID 
    AND Orderp.[Date] = Orders.[Date] 
    AND Orderp.OrderNumber = Orders.OrderNumber 
WHERE (Orders.ItemType = 2) 
    AND (Orders.ItemNumberOnMenu IN (68, 69, 70, 71, 72)) 
    AND (Orders.[Date] > '2013/01/01') 
GROUP BY Orderp.Telephone 

ИЛИ:

SELECT Orders.col1 
    , Orders.col2 
    , Orderp.Telephone 
FROM Orders 
INNER JOIN Orderp 
    ON Orderp.StoreID = Orders.StoreID 
    AND Orderp.[Date] = Orders.[Date] 
    AND Orderp.OrderNumber = Orders.OrderNumber 
WHERE (Orders.ItemType = 2) 
    AND (Orders.ItemNumberOnMenu IN (68, 69, 70, 71, 72)) 
    AND (Orders.[Date] > '2013/01/01') 
GROUP BY Orders.col1 
    , Orders.col2 
    , Orderp.Telephone 
0

В отличие от MySQL, если столбец присутствует в списке SELECT, но отсутствует в предложении GROUP BY или не используется агрегированной функцией, например MAX, SUM ..etc приведет к ошибке запроса, как показано выше.

Чтобы удалить дубликаты на основе определенного поля, которое, если я правильно вас понимаю, Orderp.Telephone, вы можете использовать функции ранжирования на разделах, таких как rownumber , rank , dense_rank. (Sql server 2005+)

Select * From 
(SELECT Orders.col1, Orders.col2,Orders.col3,Orderp.col1, Orderp.2, 
     Row_number() Over (partition by Orderp.Telephone order by  
    Orderp.Storeid) as rownum 
    FROM Orders INNER JOIN 
    Orderp ON Orderp.StoreID = Orders.StoreID 
    AND 
    Orderp.[Date] = Orders.[Date] 
    AND 
    Orderp.OrderNumber = Orders.OrderNumber 
WHERE 
    (Orders.ItemType = 2) 
    AND 
    (Orders.ItemNumberOnMenu IN (68, 69, 70, 71, 72)) 
    AND 
    (Orders.[Date] > '2013/01/01') 
) z 
WHERE rownum =1 
Смежные вопросы