Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Составление SQL-запросов > запрос из 2х тадлиц


Автор: Ronin08 19.2.2010, 11:03
Доброго времени суток
Имеется 2 таблицы:
1. org(id, name), id - PK;
2. log (id, org_id, date) id - PK;

необходимо вывести для org.id = log.org_id минималную log.date, максимальную log.date и количество log.org_id 
получится
--------------------------------------------------------------
org_id  | name  | date_min  | date_max  |  count 
-------------------------------------------------------------- 
1          | name1| 21.12.208 | 02.01.2010|  6
--------------------------------------------------------------
2          | name2| ................................


Автор: Zloxa 19.2.2010, 11:08
Цитата(Ronin08 @  19.2.2010,  11:03 Найти цитируемый пост)
необходимо 

Что именно не понятно? Как работает http://www.google.ru/search?hl=ru&newwindow=1&rlz=1C1GGLS_ruRU327RU327&q=join+sql&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA&lr=lang_ru&aq=f&oq=или как работает http://www.google.ru/search?hl=ru&newwindow=1&rlz=1C1GGLS_ruRU327RU327&q=%22group+by%22+sql&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA&lr=lang_ru&aq=f&oq=?

Автор: Deniz 19.2.2010, 15:24
Ronin08, а сам пробовал запрос написать? Напиши здесь, мы поправим, если что.

Автор: Ronin08 21.2.2010, 01:02
Код

select org.id,  Min(log.date) as date_min, Max(log.date) date_max, Count(log.date) as count

from org left outer join 
        [log] on org.id = log.org_id 
where org.id in (select log.org_id from [log])

group by org.id

так работает все нормально, но мне надо еще выводить org.name, если я добавлю в select еще org.name, то будет ошибка
Цитата

Column 'org.name' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. 

 Но если добавить в group by помимо org.id еще org.name, то все нормально. 
Просто на самом деле в реальной ХП должно быть 4 join  и выводить надо много полей. так их все и надо указывать в group by? 

Автор: Zloxa 21.2.2010, 12:20
Цитата(Ronin08 @  21.2.2010,  01:02 Найти цитируемый пост)
так их все и надо указывать в group by?  

Лучше применить к ним агрегатную функцию типа max, min.

Добавлено через 6 минут и 24 секунды
иногда можно еще можно джойн сделать после группировки
Код

select org.*,s.date_min,s.date_max,s.count 
from org 
inner join (
        select log.org_id,  Min(log.date) as date_min, Max(log.date) date_max, Count(log.date) as count
        from  [log] 
        group by org.id
) s
on s.org_id = org.id

Цитата(Ronin08 @  21.2.2010,  01:02 Найти цитируемый пост)
where org.id in (select log.org_id from [log])

это бред.
Почитай про INNER JOIN

Автор: Ronin08 21.2.2010, 15:01
Цитата(Zloxa @  21.2.2010,  12:20 Найти цитируемый пост)

Цитата(Ronin08 @  21.2.2010,  01:02 Найти цитируемый пост)
where org.id in (select log.org_id from [log])

это бред.
Почитай про INNER JOIN 


Zloxa, согласен, было еще условие, потом я его убрал и получилось что left join можно заменить inner join.
И еще, наверное, надо  group by org.id заменить на  group by log.org_id!!!

Автор: Zloxa 22.2.2010, 02:13
Цитата(Ronin08 @  21.2.2010,  15:01 Найти цитируемый пост)
надо  group by org.id заменить на  group by log.org_id

если ты про мой запрос - да.
издержки копипаста, сорри.

Автор: Ronin08 22.2.2010, 17:41
Zloxa, спасибо за помощь

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)