2012-04-05 88 views
2

我希望能夠按升序或降序對[comment]進行排序。我已經嘗試在「order by」子句中再次執行聚合,但那不起作用。我也嘗試在子查詢之外進行排序,讓我使用別名[comment],但只排序在0和10行之間。SQL Server ORDER BY [aggregation] DESC/ASC

此查詢是更大的查詢的較小版本。


SELECT * 
FROM (SELECT ISNULL((SELECT COUNT("order") 
         FROM order_comment 
         WHERE "order" = "order"."id" 
         GROUP BY "order"), 0)     AS [comment], 
       Row_number() OVER (ORDER BY "order"."id" DESC) AS [rownum] 
     FROM [order] 
     WHERE ISNULL((SELECT COUNT("order") 
         FROM order_comment 
         WHERE "order" = "order"."id" 
         GROUP BY "order"), 0) > 0) AS [filter] 
WHERE [rownum] BETWEEN 0 AND 10 

所以在MySQL的簡單!


SELECT Ifnull((SELECT COUNT(`order`) 
       FROM order_comment 
       WHERE `order` = `order`.`id` 
       GROUP BY `order`), 0) AS `comment` 
FROM `order` 
HAVING `comment` > 0 
ORDER BY `comment` DESC 
LIMIT 0, 10 
+0

請勿在子查詢中使用您的位置。將主邏輯放入子查詢中,然後對子查詢的結果進行排序(按順序排列)並過濾(其中)。 – 2012-04-05 23:25:20

+0

@zespri這會搞亂[rownum]。假設只有一行被返回,[rownum]可能是40,當你在0和10之間進行選擇時,這是行不通的。這是在這之前的一個主要問題。 – 2012-04-05 23:31:50

+0

即使沒有排序,它也能如何工作?如果它是40,那麼你的位置會將其過濾出來並且不會被返回。 – 2012-04-05 23:41:15

回答

4

繼最新的編輯懷疑你想這樣的事情

;WITH oc AS 
(
SELECT [order], 
     COUNT([order]) AS order_count 
FROM order_comment 
GROUP BY [order] 
), occ AS 
(
SELECT o.*, 
     order_count AS comment, 
     ROW_NUMBER() OVER (ORDER BY order_count DESC) AS [rownum] 
FROM [order] o 
INNER JOIN oc ON oc.[order] = o.id 
) 
SELECT * 
FROM occ 
WHERE [rownum] BETWEEN 0 AND 10 
ORDER BY [rownum] 

INNER JOIN已經排除了沒有子行的任何行order_comment

+0

謝謝!這工作。 – 2012-04-09 18:14:50

+1

它說我可以在22小時內獎賞你的賞金。 – 2012-04-09 18:19:45

0

我假設你不知道你可以使用集合函數OVER clause

COUNT(order) OVER(PARTITION BY id) AS [comment] 
.... 
ORDER BY [comment] 
+0

謝謝。我不知道。我現在正在研究這個問題。在得到結果之前,可能必須等到明天。 – 2012-04-05 23:34:40

+0

仍在處理此問題,但我不確定您是否注意到COUNT(訂單)處於子查詢中。你不能在子查詢上使用over()。 – 2012-04-06 18:48:53

0

在SQL Server中,你可以通過列號從查詢順序在ORDER BY 1點 更多的信息在這裏http://blog.sqlauthority.com/2010/12/27/sql-server-order-by-columnname-vs-order-by-columnnumber/

SELECT * 
FROM (SELECT ISNULL((SELECT COUNT("order") 
         FROM order_comment 
        WHERE "order" = "order"."id" 
        GROUP BY "order"), 0)     AS [comment], 
      Row_number() OVER (ORDER BY "order"."id" DESC) AS [rownum] 
    FROM [order] 
    WHERE ISNULL((SELECT COUNT("order") 
        FROM order_comment 
        WHERE "order" = "order"."id" 
        GROUP BY "order"), 0) > 0) AS [filter] 
WHERE [rownum] BETWEEN 0 AND 10 
ORDER BY 1 
+0

這只是在行0和10之間進行排序。使用別名[comment]或1並沒有什麼區別。 – 2012-04-06 16:08:11