行的顺序我有以下几点:添加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语句的结果不是按降序排列。
好吧,我不知道如何来简化这个(如果它甚至有可能),但它确实给你正在寻找理想的效果。 – 2010-12-06 04:37:18