按组和排序有问题

4

你好,我是一个 SQL 新手,但在学习一些基础时遇到了困难。

我有一组数据看起来像这样:

Table name: Sample
    PROJECT      WORK ORDER      AMOUNT
     -----------------------------------------
     111             a             100
     222             b             200
     111             c             300
     444             d             400
     111             e             500
     666             f             600

我希望最终呈现的效果是这样的:
Table name: Sample
    PROJECT      WORK ORDER      AMOUNT     PROJECT AMOUNT
     --------------------------------------------------------
     111             e             500           900
     111             c             300           900
     111             a             100           900
     666             f             600           600
     444             d             400           600
     222             b             200           200

按项目总金额排序

按组无法满足我的需求,因为它会将所有项目分为一组,所以我无法看到"111项目"的三个工单行。

PROJECT      WORK ORDER      AMOUNT
 -----------------------------------------
 111             a             900
 222             b             200
 444             d             400
 666             f             600

排序功能无法按最大项目价值进行排序。

Table name: Sample
    PROJECT      WORK ORDER      AMOUNT
     -----------------------------------------
     666             f             600
     111             e             500
     444             d             400
     111             c             300
     222             b             200
     111             a             100

我的另一个想法是,如果我可以创建另一列:“项目金额”,它基于“项目”列中的值计算项目总额,然后我可以轻松地按项目金额排序以实现所需的格式。

Table name: Sample
    PROJECT      WORK ORDER      AMOUNT     PROJECT AMOUNT
     --------------------------------------------------------
     111             e             500           900
     111             c             300           900
     111             a             100           900
     666             f             600           600
     444             d             400           600
     222             b             200           200

但我不知道如何得到“项目金额”列,以计算所有项目的总价值,并在出现相同项目编号的任何行上显示它们。

有什么建议吗?


谢谢你的帮助,我想我已经尝试了一千次正确和不正确的代码,认为让别人告诉我他们会如何做可能更容易。我认为下面的代码已经解决了这个问题。 - David Smith
3个回答

4
select  *
,       sum(amount) over (partition by project) as ProjAmount
,       row_number() over 
from    YourTable
order by
        ProjAmount desc

SQL Fiddle上的示例。


要选择金额最高的前两个项目,可以使用dense_rank

select  *
from    (
        select  *
        ,       dense_rank() over (order by ProjAmount desc) as dr
        from    (
                select  *
                ,       sum(amount) over (partition by project) as ProjAmount
                from    YourTable
                ) WithProjAmount
        ) WithDenseRank
where   dr < 3
order by
        ProjAmount desc

Example at SQL Fiddle.


非常感谢您,我花了将近两个星期尝试各种不同类型的代码,让自己抓狂,但我按照您的方式做到了,并且效果非常好。最后一个问题,如果您不介意,我该如何选择“前两个”?例如,只显示两个最大的项目金额,所有111和所有666? - David Smith
那需要我在表格方面做出相当多的调整,我实际处理的代码大约有10个列,与7个表连接以及其他几个,但非常感谢,我已经让它正常工作了,非常感谢。 - David Smith
如何在按ProjAmount排序后添加第二个排序条件?在您的第一段代码中,我在projamount desc之后添加了amount,它起作用了。但是我在您的第二段代码中添加了它,结果集减少到了前两个项目,而不是前两个projamount。 - David Smith
结果集始终按照外部查询末尾的order by进行排序。回答中已更新。 - Andomar
你真是个明星,抱歉我在dense rank代码中看了一下order by,认为它需要放在那里,因为结果已经按projamount正确排序,所以认为它需要在那里输入,但你是对的,太棒了 :) 我需要做些什么来投票支持你的帮助,或者只需打勾就可以了吗?再次感谢。 - David Smith
你可以通过问题旁边的向上和向下箭头投赞成票或反对票。你可以接受一个答案(打勾)。很高兴我能帮到你。 - Andomar

1
一种带有普通SQL子查询的版本。
SELECT s.*,
       (SELECT SUM(Amount) FROM Sample WHERE Project = s.Project) ProjectAmount
  FROM Sample s
 ORDER BY ProjectAmount DESC

SQLFiddle

的英译中,保留了HTML格式,不做解释。

感谢您的帮助,上面的代码使它能够工作,现在只是在研究如何选择前2个项目金额。这个社区很棒,第一次使用这个网站。 - David Smith

0
SELECT  a.project ,
        a.work  ,
        a.amount ,
        b.proj_amount
FROM    project A
        JOIN ( SELECT   SUM(amount) proj_amount ,
                        project
               FROM     project
               WHERE    project = project
               GROUP BY project
             ) b ON a.project = b.project
ORDER BY proj_amount DESC ,
        amount DESC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接