2013-04-16 48 views
9

Tôi đang cố gắng nhận đơn đặt hàng từ một thước đo. Theo quan điểm của tôi, tôi có một số hàng với chính xác các giá trị giống nhau, nhưng tôi muốn nhóm các giá trị này trên orderid và lấy tổng số lượng của đơn hàng đó.Máy chủ SQL - GROUP BY trên một cột

xem kết quả của tôi cái gì đó như:

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 

tôi muốn làm một cái gì đó như:

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

Để có được một cái gì đó như:

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 

Nhưng tôi biết nhóm bởi một đơn cột là không thể, nếu không bạn sẽ nhận được thông báo:

[...] không hợp lệ trong danh sách lựa chọn vì nó không được chứa trong hoặc hàm tổng hợp hoặc mệnh đề GROUP BY.

Có khả năng hoặc giải pháp khác để nhóm theo một cột cụ thể trong SQL Server không?

+0

Tôi xin lỗi, có điều gì đó sai trái với ví dụ của tôi, tôi đã ngồi biên tập nó, nó phải là rõ ràng bây giờ – Jovano

Trả lời

14

Bạn có thể sử dụng một CTE với SUM(Quantity)OVER(PARTITION BY Order_id) + ROW_NUMBER để chọn ra hàng mong muốn từ thứ tự nhóm:

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

Tuy nhiên, kết quả mong muốn của bạn có vẻ là không chính xác (câu hỏi chỉnh sửa)

Đây là kết quả của tôi:

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

Có vẻ như ARTICLE_ID có thể là bội số cho mỗi ORDER_ID, trong mẫu CTE trên đầu tiên được chọn, không phải là kết quả hoàn chỉnh. – harsh

+0

@harsh: OP đã không đề cập rằng anh ấy cũng muốn nhóm theo bài viết vì vậy tôi để nó như nó được. Nếu không, anh ta có thể chỉ cần thêm ARTICLE_ID vào 'PARTITION BY'. –

+0

Trước hết: Tim là đúng, nó không cần thiết để nhóm bởi Article_id vì mỗi đơn hàng chỉ có 1 loại bài viết. Thứ hai, những gì một công việc khủng khiếp và phức tạp xung quanh như thể bạn sử dụng để làm việc với MySQL, nơi nó có thể chỉ sử dụng 1 nhóm, nhưng nó làm việc TUYỆT VỜI ngay bây giờ! Tất cả các khoản tín dụng cho bạn, cảm ơn! – Jovano

10

Giả sử các cột khác là chức năng phụ thuộc vào cột nhóm, câu trả lời đơn giản nhất là một trong hai

a. Nhóm theo các cột khác cũng như:

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

hoặc

b. Sử dụng chức năng tổng hợp như max:

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

sở thích cá nhân của tôi là phương pháp thứ hai, như tôi nghĩ rằng đó là rõ ràng hơn so với lần đầu tiên trong chỉ mục nào được thực sự cần thiết cho nhóm, như trái ngược với đó là chỉ đơn thuần được nhóm lại để làm tròn vấn đề cột không được nhóm/tách rời.

+0

Đó là logic của tôi cũng vậy, nhưng khi tôi cố gắng tạo ra một cái nhìn mới, tôi nhận được một số vấn đề mới: Tại giải pháp đầu tiên của bạn, tôi nhận được: "Các kiểu dữ liệu văn bản, ntext và hình ảnh không thể so sánh hoặc sắp xếp, trừ khi sử dụng toán tử IS NULL hoặc LIKE." do một số cột tôi không đưa vào ví dụ của mình. Thứ hai của bạn không hoạt động vì tôi có một số cột varchar không hỗ trợ max() – Jovano

+0

@JorikvanOnna: Tôi mong đợi các cột varchar luôn hỗ trợ 'max', nhưng không nhất thiết phải là văn bản, các loại dữ liệu ntext hoặc hình ảnh. Vì đây có vẻ là nguyên nhân cơ bản của sự cố của bạn nên tôi khuyên bạn nên cập nhật câu hỏi của mình để bao gồm thông tin này. Câu trả lời của Tim nên hoạt động, ngay cả với giới hạn này; cách tiếp cận khác sẽ được nhóm theo cột nhóm và bao gồm giá trị tổng hợp trong chế độ xem nội tuyến/CTE, sau đó tham gia vào các bảng khác bao gồm các cột sự cố - điều này sẽ yêu cầu thêm thông tin trong câu hỏi. –

0

Trong trường hợp của bạn, có vẻ như không chính xác đối với nhóm theo Order_id có Article_id khác nhau. Bạn mong đợi kết quả có vẻ sai. Nó nên là:

PR10.001 có hai article_ID 20.001a, 41.022b và tổng số lượng 4 (không 3)

là kỳ vọng của bạn là để có được tổng số lượng cho mỗi ORDER_ID nhưng cột giữ lại khác nhau quá thì bạn cần quyết định kết quả mong đợi?một cái gì đó như:

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

kết quả mong đợi của tôi là sai, nhưng tôi đã chỉnh sửa nó, phải là ngay bây giờ – Jovano

0

Tôi đã sử dụng loại bảng tương tự như của bạn. tên sẽ là jsu khác nhau để kiểm tra nó nhanh chóng. Vui lòng tham khảo truy vấn sau. Sửa đổi tên như bạn yêu cầu.

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

VỚI CTE AS (SELECT order_id, customer_id, article_id, DELIVERY_DATE, lượng = Sum (số lượng) OVER ( phân vùng THEO order_id), rn = ROW_NUMBER() OVER ( phân vùng BY order_id ORDER BY delivery_date ASC) TỪ các đơn đặt hàng) SELECT order_id, customer_id, article_id, DELIVERY_DATE, lượng TỪ CTE ĐÂU rn = 1

Các vấn đề liên quan