2013-08-29 6 views
2

я в настоящее время есть данные, организованные в 2-х таблиц, например:SQL множественным где и поля

Встречи
meet_id
meet_category

Заказы
Order_ID
meet_id
ORDER_DATE

Мне нужно написать один запрос, который возвращает общее количество встреч, количество встреч с категорией «длинный» и количество встреч с категорией «короткий». граф только встречи, которые имеют по крайней мере один order_date после 1 марта 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

Это работает! Большое спасибо! – user2728555

+0

Обратите внимание, этот запрос работает только на MySql, потому что meet_category не включает в группу по статье –

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, поэтому, если вы попытаетесь связать подзапрос с полем в основном запросе, у вас есть ошибка о сгруппированных полях.