基于SQL Server

时间:2016-01-07 05:23:55

标签: sql sql-server group-by sql-order-by

我有一张这样的桌子..

Priority | Amount | Case
P1       | 100    | 1
P1       | 200    | 2
P1       | 300    | 1
P3       | 400    | 3

我想首先按PriorityAmount(降序)然后Case订购,看起来像这样。

Priority | Amount | Case
P1       | 300    | 1
P1       | 100    | 1
P1       | 200    | 2
P3       | 400    | 3

如果我使用ORDER BY Priority, Amount DESC, Case,则返回此值。 Case未根据最高Amount值组合在一起的位置。

Priority | Amount | Case
P1       | 300    | 1
P1       | 200    | 2
P1       | 100    | 1
P3       | 400    | 3

编辑:为清晰起见,再添加一条记录:

Priority | Amount | Case
P1       | 100    | 1
P1       | 200    | 2
P1       | 300    | 1
P1       | 200    | 0   << New record
P3       | 400    | 3

这应该返回:

Priority | Amount | Case
P1       | 300    | 1
P1       | 100    | 1
P1       | 200    | 0
P1       | 200    | 2
P3       | 400    | 3

首先按Priority分组,其中按最高Amount排序,然后按Amount分组Case

5 个答案:

答案 0 :(得分:2)

您需要使用窗口化聚合来查找每个Case中的最高金额,然后使用 进行排序:

declare @t table ([Priority] varchar(19) not null,Amount int not null, [Case] int not null)
insert into @t ([Priority],Amount,[Case]) values
('P1',100,1),
('P1',200,2),
('P1',300,1),
('P1',200,0),
('P3',400,3)

select
    *
from
    (
        select *,MAX(Amount) OVER (PARTITION BY [Case]) as mAmount
        from @t
    ) t
order by [Priority],mAmount desc,[Case],Amount desc

结果:

Priority            Amount      Case        mAmount
------------------- ----------- ----------- -----------
P1                  300         1           300
P1                  100         1           300
P1                  200         0           200
P1                  200         2           200
P3                  400         3           400

另外,请考虑重新命名一些列 - 我必须在[]括号中包含两个列,因为它们是保留字。通常最好完全避免使用保留字。

答案 1 :(得分:1)

CREATE TABLE SHANKATABLE (PRIORITY VARCHAR(2), AMOUNT INT, [CASE] INT)
INSERT INTO SHANKATABLE VALUES('P1',   100 , 1)
INSERT INTO SHANKATABLE VALUES ('P1',   200 , 2)
INSERT INTO SHANKATABLE VALUES ('P1',   300 , 1)
INSERT INTO SHANKATABLE VALUES ('P3',   400 , 3)

要获得第一个结果,只需使用以下查询,

基于Damien_The_Unbeliever回答,我只是更新我的回答。

SELECT PRIORITY,[CASE],AMOUNT
FROM   (
           SELECT PRIORITY,[CASE],AMOUNT,MAX(Amount) OVER(PARTITION BY [Case]) AS mAmount
           FROM   SHANKATABLE
       ) Temp
ORDER BY
       [Priority],mAmount DESC,[Case],Amount DESC

updated sql fiddle demo

答案 2 :(得分:0)

我想你想要这个

select * from tablename ORDER BY Priority, [case] , Amount DESC

答案 3 :(得分:0)

标识符不能是SQL中的保留关键字,不能包含嵌入空格,也不能包含补充字符。

必须分隔不符合这些规则的标识符。

例如,名为2006的属性被视为不规则标识符,因为它以数字开头,因此必须分隔为&#34; 2006&#34;或[2006]。诸如y2006之类的常规标识符可以在没有分隔符的情况下简单地引用为y2006,或者它可以是带分隔符的可选项。您可能不希望划分常规标识符,因为分隔符会使代码混乱。

答案 4 :(得分:0)

试试这个: -

2016-01-07 07:10:22,200 4198 ERROR None openerp.http: Exception during JSON request handling.
Traceback (most recent call last):
File "/opt/odoo/openerp/http.py", line 518, in _handle_exception
return super(JsonRequest, self)._handle_exception(exception)
File "/opt/odoo/openerp/http.py", line 1358, in _dispatch_nodb
func, arguments = self.nodb_routing_map.bind_to_environ(request.httprequest.environ).match()
File "/usr/lib/python2.7/dist-packages/werkzeug/routing.py", line 1433, in match
    raise NotFound()
NotFound: 404: Not Found