2013-08-29 43 views
2

我现在有2台这样组织的数据:SQL多个地方和领域

会议
meet_id
meet_category

订单
ORDER_ID
meet_id
order_date的

我需要编写一个查询来返回会议总数,“long”类别的会议数量以及“short”类别的会议数量。 计数仅3月1日之后,至少有一个order_date的会议,2011年

输出应该在3场和1个排

到目前为止,我什么我有是:

SELECT COUNT(m.meet_id), 
COUNT(SELECT m.meet_id WHERE m.meet_category = 'long'), 
COUNT(SELECT m.meet_id WHERE m.meet_category = 'short') 
FROM Meetings m 
INNER JOIN Orders o 
ON m.meet_id = o.meet_id 
WHERE o.order_date >= '2011-03-01'; 

这是首先想到的,但这个查询不起作用,我甚至不知道我的方法是否正确。所有帮助赞赏!

回答

1

试试这个:

SELECT COUNT(m.meet_id), 
SUM(CASE WHEN m.meet_category = 'long' THEN 1 ELSE 0 END), 
SUM(CASE WHEN m.meet_category = 'short' THEN 1 ELSE 0 END) 
FROM Meetings m where meet_id in 
    (select meet_id 
    FROM Orders o 
    WHERE o.order_date >= '2011-03-01'); 
+0

This Works!非常感谢! – user2728555

+0

注意,此查询仅适用于MySql,因为meet_category不包含在group by子句中 –

0

,如果你只想要一个行试试这个

select count(1) as total_count,innerqry.* 

(
select count(m.meet_id), meet_catagory 
Meetings m 
INNER JOIN Orders o 
ON m.meet_id = o.meet_id 
and m.meet_id in 
(select meet_id from orders where order_date>= '2011-03-01') 

group by meet_category 
) innerqry 

和你几个已知的会议类型试试这个

SELECT COUNT(m.meet_id), 
SUM(CASE WHEN m.meet_category = 'long' THEN 1 ELSE 0 END), 
SUM(CASE WHEN m.meet_category = 'short' THEN 1 ELSE 0 END) 
FROM Meetings m 
INNER JOIN Orders o 
ON m.meet_id = o.meet_id 
WHERE m.meet_id in 
(select meet_id from orders where order_date>'2011-03-01') 
0

试试这个:

SELECT COUNT(m.meet_id), 
(select count(*) from meetings m2 join orders o2 on o2.meet_id = m2.meet_id where m2.meet_category = 'long' and o2.order_date >= '2011-03-01'), 
(select count(*) from meetings m2 join orders o2 on o2.meet_id = m2.meet_id where m2.meet_category = 'short' and o2.order_date >= '2011-03-01') 
FROM mettings m 
INNER JOIN Orders o 
ON m.meet_id = o.meet_id 
WHERE o.order_date >= '2011-03-01'; 

您必须实现两个独立的子查询,因为您希望主查询中没有按照meet_id分组的总数,所以如果您尝试在主查询中将子查询与字段关联起来,则会出现有关按字段分组的错误。