2013-04-16 3 views
9

Я пытаюсь получить заказы из orderview. На мой взгляд, у меня есть несколько строк с точно такими же значениями, но я хочу сгруппировать эти значения на orderid и взять сумму количества этого порядка.SQL Server - GROUP BY на одном столбце

Мой просмотр результатов что-то вроде:

Order_id Customer_id Article_id Delivery_date Quantity 
--------------------------------------------------------------------------- 
PR10.001 11   20.001a  17-04-2013  1 
PR10.001 11   20.001a  17-04-2013  1 
PR10.001 11   20.001a  17-04-2013  1 
PR13.001 15   41.022b  19-04-2013  1 
PR13.001 15   41.022b  19-04-2013  1 

Я хочу сделать что-то вроде:

SELECT Order_id, Customer_id Article_id, Delivery_date, sum(Quantity) 
FROM Orders 
GROUP BY Order_id 

Чтобы получить что-то вроде:

Order_id Customer_id Article_id Delivery_date Quantity 
--------------------------------------------------------------------------- 
PR10.001 11   20.001a  17-04-2013  3 
PR13.001 15   41.022b  19-04-2013  2 

Но я знаю, что группировка по одной единственной столбец невозможен, в противном случае вы получите сообщение:

[...] недопустим в списке выбора, потому что он не содержится в как совокупная функция, так и предложение GROUP BY.

Есть ли другая возможность или обходное решение для группировки по одному конкретному столбцу в SQL Server?

+0

Я сожалею, что-то было не так с моего примера, я Editted это, должно быть теперь ясно – Jovano

ответ

14

Вы можете использовать CTE с SUM(Quantity)OVER(PARTITION BY Order_id) + ROW_NUMBER, чтобы выбрать нужную строку из заказа-группы:

WITH cte 
    AS (SELECT order_id, 
       customer_id, 
       article_id, 
       delivery_date, 
       quantity=Sum(quantity) 
          OVER( 
          partition BY order_id), 
       rn = Row_number() 
         OVER( 
         partition BY order_id 
         ORDER BY delivery_date ASC) 
     FROM orders) 
SELECT order_id, 
     customer_id, 
     article_id, 
     delivery_date, 
     quantity 
FROM cte 
WHERE rn = 1 

DEMO

Однако желаемый результат представляется неверным (вопрос)

Это мой результат:

ORDER_ID CUSTOMER_ID ARTICLE_ID DELIVERY_DATE QUANTITY 
PR10.001 11   20.001a   17-04-2013 3 
PR13.001 15   41.022b   19-04-2013 2 
+0

Кажется, что ARTICLE_ID может быть кратным для каждого ORDER_ID, в выбранном выше примере CTE выбран не полный результат. – harsh

+0

@harsh: OP не упомянул, что он также хочет группу по статье, поэтому я оставил ее как есть. В противном случае он мог бы просто добавить ARTICLE_ID в «PARTITION BY». –

+0

Прежде всего: Тим прав, не обязательно группировать Article_id, потому что каждый заказ имеет только один вид статьи. Во-вторых, какая страшная и сложная работа, как если бы вы работали с MySQL, где можно просто использовать 1 группу, но теперь она работает GREAT! Все кредиты вам, спасибо! – Jovano

10

Предполагая, что другие столбцы функционально зависит от столбца группирования, простейшие ответы либо

а. Группировка других столбцов, а также:

SELECT Order_id, Customer_id, Article_id, Delivery_date, sum(Quantity) 
FROM Orders 
GROUP BY Order_id, Customer_id, Article_id, Delivery_date 

или

б. Используйте агрегатную функцию, такую ​​как max:

SELECT Order_id, max(Customer_id), max(Article_id), max(Delivery_date), sum(Quantity) 
FROM Orders 
GROUP BY Order_id 

Моего личным предпочтением является вторым подходом, как я думаю, что это яснее, чем первый, в котором указывается, какие элементы действительно необходимы для группировки, в отличие от которых просто группируются чтобы обойти проблему разгруппированной/неагрегатной колонки.

+0

Это была моя логика тоже, но когда я попытайтесь создать новое представление, у меня появятся новые проблемы: при первом решении я получаю: «Тип данных, текст и тип данных изображения не могут сравниваться или сортироваться, за исключением случаев использования оператора IS NULL или LIKE», который должен быть вызванные некоторыми столбцами, которые я не включил в мой пример. Ваш второй не работает ни потому, что у меня есть несколько столбцов varchar, которые не поддерживают max() – Jovano

+0

@JorikvanOnna: я ожидал бы, что столбцы varchar всегда будут поддерживать 'max', но не обязательно текстовые, ntext или типы данных изображения. Поскольку это, по-видимому, является основной причиной вашей проблемы, я предлагаю обновить ваш вопрос, чтобы включить эту информацию. Ответ Тима должен работать, даже с этим ограничением; другим подходом было бы группировать столбец группировки и включать агрегированное значение во встроенное представление/CTE, а затем присоединяться к другим таблицам, которые включают столбцы проблемы, - для этого потребовалось бы больше информации в вопросе. –

0

В вашем сценарии не представляется правильным группировать Order_id с переменной Article_id. Вы ожидали, что результат окажется неправильным. Оно должно быть:

PR10.001 имеет два article_id 20.001a, 41.022b и общее количество 4 (не 3)

ли ваши ожидания, чтобы получить общее количество для каждого Order_ID, но сохраняя изменяющийся столбец слишком, то вам нужно определить ожидаемый результат?что-то вроде:

Order_id Customer_id Article_id   Delivery_date Quantity 
--------------------------------------------------------------------------- 
PR10.001 11   20.001a, 41.022b  17-04-2013  4 
PR13.001 15   41.022b    19-04-2013  2 
+0

мой ожидаемый результат был ошибочным, но я его отредактировал, должен быть прямо сейчас – Jovano

0

Я использовал аналогичный стол, как ваш. имена будут разными jsu, чтобы быстро протестировать их. Обратите внимание на следующий запрос. Измените имена по мере необходимости.

select ordid,customerid,articleid,SUM(cast(quantity as numeric)) quantity from test_stack group by ordid,customerid,articleid 
0

С СТЕ AS (SELECT order_id, customer_id, article_id, delivery_date, количество = Сумма (количество) НАД ( раздел ПО order_id), гп = ROW_NUMBER() НАД ( раздел BY order_id ORDER BY delivery_date ASC) ОТ заказов) ВЫБЕРИТЕ order_id, customer_id, article_id, delivery_date, количество ОТ КТР ГДЕ гп = 1