4

这是一个简单的问题,我不确定这里是否可行。这是问题所在:

=> http://sqlfiddle.com/#!12/584f1/7

解释:

  • 票属于参加者
  • 与会者有收入
  • 我需要按部分对票进行分组并获得总收入。
  • 这会重复计算与会者,因为 2 张门票可以属于同一与会者,因此会重复计算。我想获取收入的总和,但只计算参加者一次。

在我的 sqlfiddle 示例中,我希望看到:

section | total_revenue
------------------------
A       | 40            <= 40 is correct, but I'm getting 50...
B       | null
C       | 40

我想在不使用子查询的情况下解决这个问题。我需要一个可扩展的解决方案,允许我在单个查询中对不同连接上的多个列执行此操作。因此,无论我如何做到这一点,我都愿意接受建议。

谢谢你的帮助。

4

3 回答 3

1

这是使用的版本row_number()

select section,
  sum(revenue) Total
from 
(
  select t.section, a.revenue,
    row_number() over(partition by a.id, t.section order by a.id) rn
  from tickets t
  left join attendees a
    on t.attendee_id = a.id
) src
where rn = 1
group by section
order by section;

请参阅带有演示的 SQL Fiddle

于 2012-11-01T19:23:42.343 回答
1

同样,没有子查询

关键元素是添加PARTITION BY到窗口函数:

SELECT DISTINCT
       t.section
--    ,sum(count(*))       OVER (PARTITION BY t.section) AS tickets_count
      ,sum(min(a.revenue)) OVER (PARTITION BY t.section) AS atendees_revenue
FROM   tickets t
LEFT   JOIN attendees a ON a.id = t.attendee_id
GROUP  BY t.attendee_id, t.section
ORDER  BY t.section;

-> sqlfiddle

在这里,您GROUP BY t.attendee_id, t.section在通过窗口函数运行结果之前。并PARTITION BY t.section在窗口函数中使用,因为您希望这次按部分分区的结果。

如果您也想计算票数,请取消注释第二行。

否则,它的工作原理类似于我对您上一个问题的回答。即,其余的解释适用。

于 2012-11-01T22:24:26.883 回答
0

你可以这样做:

select t.section, sum(d.revenue)
from 
(
  SELECT DISTINCT section, attendee_id FROM tickets
) t
left join attendees d on t.attendee_id = d.id
group by t.section
order by t.section;
于 2012-11-01T19:20:43.160 回答