我需要做一个子查询

时间:2013-04-05 03:23:30

标签: sql count group-by subquery h2

我有两张桌子:邀请函和活动。

我需要获取事件的名称,每个事件的访客总数以及在同一查询中每个事件的真实时间的总数

加入两个表(左连接)选择events.name,count(invitations.guest),count(invitations.presents when = true)并按事件分组......

查看表格数据......

https://dl.dropbox.com/u/360112/Duda/invitaciones.jpg https://dl.dropbox.com/u/360112/Duda/eventos.jpg

我认为它可行,但我得不到我想要的......

SELECT e.name, count(in.guest) as Guests, (SELECT count(presents) 
FROM watermelon.invitations WHERE presents = true) as Presents 
FROM watermelon.events e LEFT JOIN watermelon.invitations in ON e.id = in.event 
GROUP BY in.event;

然后我得到:

http://dl.dropbox.com/u/360112/Duda/resultado.jpg

有什么建议吗?我需要它,而且我厌倦了尝试并得到错误的结果...... 提前致谢!

2 个答案:

答案 0 :(得分:2)

使用COUNTGROUP BYCASE听起来像你想要这样的东西:

SELECT E.Id, 
    E.Name, 
    COUNT(I.Id) TotalGuests,
    COUNT(CASE WHEN I.Presents = 'TRUE' THEN 1 END) TotalPresents
FROM Events E
    LEFT JOIN Invitations I ON E.Id = I.Event
GROUP BY E.Id, E.Name

我对你的Presents数据类型不肯定,但这应该很接近。同时使用LEFT JOIN返回所有事件。

答案 1 :(得分:1)

问题是你的子查询
(SELECT count(presents) FROM watermelon.invitations WHERE presents = true)
没有做任何过滤;它只是计算表中的所有记录,每次调用时都是真实的。下面的查询应该按照您的需要进行。这是完全相同的查询,除了我添加了“and subq.event = e.id”条件,它将子查询限制为该特定记录的数据:
SELECT e.name, count(in.guest) as Guests, (SELECT count(subq.presents) FROM watermelon.invitations as subq WHERE subq.presents = true and subq.event=e.id) as Presents FROM watermelon.events e LEFT JOIN watermelon.invitations in ON e.id = in.event GROUP BY in.event;