2010-12-06 43 views
2

行的顺序我有以下几点:添加ROW_NUMBER影响汇总

CREATE TABLE food_delivery 
(
    foodtype varchar(50) NOT NULL, 
    foodname varchar(50) NOT NULL, 
    numitems int NOT NULL 
) 
go 

INSERT INTO food_delivery 
VALUES 
('vegetable', 'carrot', 30), 
('vegetable', 'carrot', 50), 
('vegetable', 'potato', 40), 
('vegetable', 'potato', 60), 
('fruit', 'apple', 50), 
('fruit', 'apple', 70), 
('fruit', 'banana', 60), 
('fruit', 'banana', 80) 
GO 

现在,当我运行此查询:

SELECT foodtype, foodname, SUM(numitems) 
FROM food_delivery 
GROUP BY foodtype, foodname WITH ROLLUP 

我得到这个:

foodtype  foodname  
------------ ------------ ----------- 
fruit  apple  120 
fruit  banana  140 
fruit  NULL   260 
vegetable carrot  80 
vegetable potato  100 
vegetable NULL   180 
NULL   NULL   440 

我我很高兴与此订购,但我也想添加每种食物类型的项目的排名,所以我有这样的事情:

foodtype  foodname     
------------ ------------ ----------- -------------------- 
fruit  apple  120   1 
fruit  banana  140   2 
fruit  NULL   260   3 
vegetable carrot  80   1 
vegetable potato  100   2 
vegetable NULL   180   3 
NULL   NULL   440   1 

这个想法是,我想识别排名为1的行,并对它们进行不同处理。

所以这是我使用查询:

SELECT foodtype, foodname, SUM(numitems), 
     ROW_NUMBER() OVER (PARTITION BY foodtype ORDER BY foodname, SUM(numitems)) 
FROM food_delivery 
GROUP BY foodtype, foodname WITH ROLLUP 

不幸的是,在添加ROW_NUMBER()完全抛出我的结果集不正常的顺序,我得到这个:

foodtype  foodname     
------------ ------------ ----------- -------------------- 
NULL   NULL   440   1 
fruit  NULL   260   1 
fruit  apple  120   2 
fruit  banana  140   3 
vegetable NULL   180   1 
vegetable carrot  80   2 
vegetable potato  100   3 

即摘要是在每个组的顶部,而不是在底部。

任何人都可以告诉我如何在每个组的底部获得我的摘要,同时仍然有我的排名

谢谢。


编辑:那么乔恩·赛格尔的回答给我我想要的,但我还是不明白,为什么其他的解决方案不起作用。

借此:

SELECT CASE WHEN foodtype IS NULL THEN 0 ELSE 1 END, 
     foodtype, 
     CASE WHEN foodname IS NULL THEN 0 ELSE 1 END, 
     foodname, 
     SUM(numitems), 
     ROW_NUMBER() OVER (PARTITION BY foodtype 

ORDER BY CASE WHEN foodtype IS NULL THEN 0 ELSE 1 END, 
      foodtype, 
      CASE WHEN foodname IS NULL THEN 0 ELSE 1 END, 
      foodname DESC) RankVal 

FROM food_delivery 
GROUP BY foodtype, 
      foodname WITH ROLLUP 

ORDER BY CASE WHEN foodtype IS NULL THEN 0 ELSE 1 END, 
      foodtype, 
      CASE WHEN foodname IS NULL THEN 0 ELSE 1 END, 
      foodname DESC 

这几乎是相同的Jon的溶液,不同之处在于我有顺序为降序,我移调和在THEN 0 ELSE 1。在我看来,这应该给我相同的结果(即NULLS将为0,并且由于它们正在被分类为DESC,它们应该出现在该集合的底部)。然而,返回的结果集是这样的:

  foodtype     foodname     RankVal 
----------- ------------ ----------- ------------ ----------- -------------------- 
0   NULL   0   NULL   440   1 
1   fruit  0   NULL   260   1 
1   fruit  1   banana  140   2 
1   fruit  1   apple  120   3 
1   vegetable 0   NULL   180   1 
1   vegetable 1   potato  100   2 
1   vegetable 1   carrot  80   3 

正如你可以看到,从CASE语句的结果不是按降序排列。

回答

1
SELECT 
    foodtype, 
    foodname, 
    NumItems, 
    ROW_NUMBER() OVER 
    (
     PARTITION BY foodtype 
     ORDER BY 
      (CASE WHEN foodtype IS NULL THEN 1 ELSE 0 END), 
      foodtype, 
      (CASE WHEN foodname IS NULL THEN 1 ELSE 0 END), 
      foodname 
    ) AS Rank 
    FROM 
    (
     SELECT 
      foodtype, 
      foodname, 
      SUM(numitems) AS NumItems 
      FROM food_delivery 
      GROUP BY foodtype, foodname WITH ROLLUP 
    ) a 
    ORDER BY 
     (CASE WHEN foodtype IS NULL THEN 1 ELSE 0 END), 
     foodtype, 
     (CASE WHEN foodname IS NULL THEN 1 ELSE 0 END), 
     foodname 
+0

好吧,我不知道如何来简化这个(如果它甚至有可能),但它确实给你正在寻找理想的效果。 – 2010-12-06 04:37:18

1

尝试明确指定ORDER BY

喜欢的东西

SELECT foodtype, 
     foodname, 
     SUM(numitems), 
     ROW_NUMBER() OVER (PARTITION BY foodtype ORDER BY foodname, SUM(numitems)) RankVal 
FROM @food_delivery 
GROUP BY foodtype, 
      foodname WITH ROLLUP 

ORDER BY CASE WHEN foodtype IS NULL THEN 1 ELSE 0 END, 
      foodtype, 
      CASE WHEN foodname IS NULL THEN 1 ELSE 0 END, 
      foodname, 
      RankVal