2

我目前将数据组织在 2 个表中,如下所示:

会议
meet_id
meet_category

订单
order_id
meet_id
order_date

我需要编写一个查询来返回会议总数、“长”类别的会议数量和“短”类别的会议数量。仅计算 2011 年 3 月 1 日之后至少有一个 order_date 的会议。

输出应在 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'; 

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

4

3 回答 3

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'); 
于 2013-08-29T09:32:27.150 回答
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')
于 2013-08-29T09:32:43.790 回答
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 分组,因此如果您尝试将子查询与主查询中的字段链接,您会遇到按字段分组的错误。

于 2013-08-29T09:45:15.503 回答