2012-04-05 87 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