如何在PL / SQL中返回COUNT的SUM

时间:2014-12-09 16:38:35

标签: sql oracle plsql oracle-sqldeveloper

场景:我正在尝试构建一个返回COUNT的SUM的查询。
查询的目的:我需要识别目前在2个或更多职位上列出的所有参与者。

当前查询:

select pa.firstname, pa.lastname, pos.name as "POSITION", count(pos.name) as "POSITION COUNT"

from cs_participant pa, cs_position pos

where pa.payeeseq = pos.payeeseq
and pa.firstname like '%DEV%'
and pa.lastname like '%TEST%'

group by pa.firstname, pa.lastname, pos.name

结果:
enter image description here

我需要对POSITION COUNT进行SUM并以某种方式仅返回FIRSTNAME,LASTNAME和SUM。因此,如果参与者当前有2个或更多个职位,则查询将返回参与者的FIRSTNAME,LASTNAME和职位的总和。

如果我还可以返回远列中的POSITION而不为每个唯一的POSITION创建重复的行,那将是一个巨大的帮助!

例如,具有2个POSITIONS的参与者将在第一行返回参与者的FIRSTNAME,LASTNAME,SUM OF POSITIONS和POSITION_1,而第二行将具有参与者的FIRSTNAME,LASTNAME的空白值,和POSITIONS的总和,但在第4列中返回POSITION_2(类似于"中断#34; Web Intelligence中的功能)。

谢谢!

3 个答案:

答案 0 :(得分:1)

您只需将聚合与having子句一起使用:

select pa.firstname, pa.lastname, count(*) as "POSITION COUNT"
from cs_participant pa join
     cs_position pos
     on pa.payeeseq = pos.payeeseq
group by pa.firstname, pa.lastname
having count(*) >= 2;

我删除了where条件,因为目前尚不清楚这些条件是什么。当然,如果它们与您的查询相关,您可以将它们重新放入。

答案 1 :(得分:0)

据我了解您的问题,请查看此信息。内部SQL与您在问题中的内容完全相同。我将它包装在另一个SQL中以获得总和:

select firstname, lastname, sum(position_count)
  from (select pa.firstname firstname,
               pa.lastname lastname,
               pos.name as position,
               count(pos.name) as position_count
          from cs_participant pa, cs_position pos
         where pa.payeeseq = pos.payeeseq
           and pa.firstname like '%DEV%'
           and pa.lastname like '%TEST%'
         group by pa.firstname, pa.lastname, pos.name)
 group by firstname, lastname
 having sum(position_count) >= 2;

结果是:

FIRSTNAME            LASTNAME             SUM(POSITION_COUNT)
-------------------- -------------------- -------------------
DEV                  TEST                                   2

答案 2 :(得分:0)

此查询使用分析函数返回每个参与者的名字,姓氏,位置和(总)位置计数。它使用row_number仅为每个参与者打印一个名字和一个姓氏(并在第一行之后将其留空)。

select
    case when rn = 1 then firstname else '' end firstname,
    case when rn = 1 then lastname else '' end lastname,
    name as "POSITION",
    position_count as "POSITION COUNT"
from (
    select pa.firstname, pa.lastname, pos.name,
    count(*) over (partition by pa.firstname, pa.lastname) position_count,
    row_number() over (partition by pa.firstname, pa.lastname order by pos.name) rn
    from cs_participant pa
    join cs_position pos on pa.payeeseq = pos.payeeseq
) t1 where position_count > 1
order by firstname, lastname, rn