场景:我正在尝试构建一个返回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
结果:
我需要对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中的功能)。
谢谢!
答案 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