2012-08-08 128 views
4

我有一個查詢,將使用UNION ALL將2個表中的結果返回爲1,這些查詢全部按我需要的方式工作。不過,我需要在返回的數據集上運行GROUP BY和ORDER BY,但是我收到很多錯誤,我不知道如何解決它。SQL GROUP BY的子查詢

這裏是我的查詢:

SELECT ProductID, Quantity 
FROM BasketItems 
UNION ALL 
SELECT ProductID, Quantity 
FROM OrderItems 

這將返回一個結果集,如本:

ProductID Quantity 
15   2 
20   2 
15   1 
8   5 
5   1 

然後我想在ProductID場運行GROUP BY,然後最後一個ORDER BY DESCQuantity字段。所以在最終的輸出,這個特定的結果集將最終導致這樣:

如前所述:

ProductID 
8 
15 
20 
5 

然後我就可以在這個結果集,因爲我通常做

EDIT運行查詢上面,但也許不夠暗示的是,我將需要對返回的結果運行查詢,這是不工作的,因爲您不能對一組結果具有ORDER BY子句運行查詢(就我從錯誤列表)

如果你想對這個問題的詳細信息,那就是:

從這個結果集,我想要得到的產品從產品表,他們涉及到

SELECT * FROM Products WHERE ID IN (
    SELECT ProductID 
    FROM 
    (
     SELECT ProductID, Quantity 
     FROM BasketItems 
     UNION ALL 
     SELECT ProductID, Quantity 
     FROM OrderItems 
    ) v 
    GROUP BY ProductID 
    ORDER BY SUM(Quantity) DESC 
) 

不過,我得到這個錯誤:除非指定了TOP,OFFSET或FOR XML,否則ORDER BY子句在視圖,內聯函數,派生表,子查詢和公用表表達式中無效。

的產品需要的順序,他們在子查詢返回的(按數量)

+0

在最終的結果集,你只需要產品ID,還是你仍想量以顯示? – Taryn 2012-08-08 10:39:44

+0

@bluefeet我只需要最終結果集中的ProductID – JakeJ 2012-08-08 10:40:40

+0

引入這個新表'產品'有點改變了這個問題 - 將需要編輯我的答案 – whytheq 2012-08-08 11:09:15

回答

7
SELECT Products.* 
FROM Products 
    INNER JOIN 
(
    SELECT ProductID, Sum(Quantity) as QuantitySum 
    from 
    (
     SELECT ProductID, Quantity 
     FROM BasketItems 
     UNION ALL 
     SELECT ProductID, Quantity 
     FROM OrderItems 
    ) v 
    GROUP BY ProductID 
) ProductTotals 
    ON Products.ID = ProductTotals.ProductID 
ORDER BY QuantitySum DESC 
+0

工程就像一個魅力,謝謝! – JakeJ 2012-08-08 10:50:33

+0

請參閱編輯以發佈信息,我應該首先詳細闡述這一點,但我認爲我可以直接發佈回答 – JakeJ 2012-08-08 11:05:35

+0

您剛完成的編輯有一些錯誤,提及產品ID和ProductName的無效列名稱 – JakeJ 2012-08-08 11:11:39

1

將這項工作的產出?

SELECT ProductID 
    from 
    (
     SELECT ProductID, Quantity 
     FROM BasketItems 
     UNION ALL 
     SELECT ProductID, Quantity 
     FROM OrderItems 
    ) temp 
    GROUP BY temp.ProductID 
    ORDER BY SUM(temp.Quantity) desc 
0

這裏的CTE版本(不帶電測試,所以請原諒的失誤)

編輯

;WITH myInitialdata_cte(ProductID,Quantity) 
AS 
    (
    SELECT ProductID, Quantity FROM BasketItems 
    UNION ALL 
    SELECT ProductID, Quantity FROM OrderItems 
    ) 
SELECT b.ID 
FROM 
    myInitialdata_cte a 
    INNER JOIN Products b ON 
     a.ProductID = b.ID 
GROUP BY ProductID 
ORDER BY SUM(a.Quantity) DESC 
+0

作品,但請參閱編輯張貼,我已詳細闡述了一點,我應該詳細闡述 – JakeJ 2012-08-08 11:07:45

+0

無後顧之憂 - 我已經去了編輯 - 至少這給你一個CTE看起來像什麼的想法 – whytheq 2012-08-08 11:14:19