Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 GROUP BY и подзапрос или как их подружить  [new]
STEREOLOVER.CS
Member

Откуда:
Сообщений: 21
Народ бьюсь уже кучу времени. Есть запрос, объединяющий три таблицы. Пусть они будут называться car, box и load. Объёдинены они с использованием left join
                           см          см       см                  м3
car.name box.name box.height box.width box.depth load.name load.volume
жигули ящик 1 20 30 50 корова 0,5
жигули ящик 2 10 50 10 свинья 0,2
ламборгини ящик 3 15 15 20 картошка 0,1
ламборгини ящик 3 15 15 20 морковка 0,15
ламборгини ящик 4 10 10 10 null null



Там где null, как вы догадываетесь, ящик без груза. Задача следующая. Нужно вычислить объём всех ящиков и объём всех грузов и группировать это всё по имени машины.

car.name       box_volume load_volume
жигули 1,1 0,7
ламборгини 0,7 0,25


P.S. в box_volume не рассчитывал точно, а поставил цифры от балды. Дынные выше только для примера как должно выглядеть в итоге.

Сам запрос выглдядит примерно так:

select car.name

from car, box left join load on box.id=load.box_id
where....
group by car.name

Стал на, том что не могу посчитать объём всех ящиков, т.к. если просто указать SUM(box.height*box.width*box.depth)/1000000 у меня объём ящика 3 посчитается 2 раза, а если использовать вложенный запрос для выбора только подходящих строк из box между select и where, то GROUP BY car.name не группирует данные из подзапроса :( Подскажите как можно решить данную задачу?
Заранее спасибо за помощь!
10 авг 10, 11:15    [9238784]     Ответить | Цитировать Сообщить модератору
 Re: GROUP BY и подзапрос или как их подружить  [new]
SQLap
Member [заблокирован]

Откуда:
Сообщений: 34063
STEREOLOVER.CS,

а бокс с каром у тебя не соединяются никак?

приведи нормальный запрос, чего гадать-то
10 авг 10, 11:32    [9238946]     Ответить | Цитировать Сообщить модератору
 Re: GROUP BY и подзапрос или как их подружить  [new]
Lecter
Member

Откуда: Киев
Сообщений: 2032
STEREOLOVER.CS

Стал на, том что не могу посчитать объём всех ящиков, т.к. если просто указать SUM(box.height*box.width*box.depth)/1000000 у меня объём ящика 3 посчитается 2 раза...

Почему?
10 авг 10, 11:53    [9239113]     Ответить | Цитировать Сообщить модератору
 Re: GROUP BY и подзапрос или как их подружить  [new]
STEREOLOVER.CS
Member

Откуда:
Сообщений: 21
SQLap
STEREOLOVER.CS,

а бокс с каром у тебя не соединяются никак?

приведи нормальный запрос, чего гадать-то


А зачем тебе весь запрос? Между where и group by менять не нужно ничего, т. к. общий объём грузов я не смогу посчитать тогда.
10 авг 10, 12:04    [9239241]     Ответить | Цитировать Сообщить модератору
 Re: GROUP BY и подзапрос или как их подружить  [new]
STEREOLOVER.CS
Member

Откуда:
Сообщений: 21
Lecter
STEREOLOVER.CS

Стал на, том что не могу посчитать объём всех ящиков, т.к. если просто указать SUM(box.height*box.width*box.depth)/1000000 у меня объём ящика 3 посчитается 2 раза...

Почему?


Посмотри внимательнее. В ламборгини у меня лежит два ящика Ящик 3 и Ящик 4. А в ящике 3 у меня лежит два груза:морковка и картошка. По правилу объединения таблиц данные про Ящик 3 дублируются. Получается, что ты при банальном расчёте объёма ящиков посчитаешь объём Ящика 3 два раза! А мне нужно посчитать объём всех неповторяющихся ящиков, т.е. distinct box.name.

Так понятнее?
10 авг 10, 12:11    [9239307]     Ответить | Цитировать Сообщить модератору
 Re: GROUP BY и подзапрос или как их подружить  [new]
SQLap
Member [заблокирован]

Откуда:
Сообщений: 34063
STEREOLOVER.CS

А зачем тебе весь запрос?


Хотя бы для того, чтобы посмотреть, как ящики с машинами соединяются.

А так, ответ тоже можно представить в общем виде

select ...
from cars c,
(подзапрос, вычисляющий объем ящиков с группировкой по машинам) b,
(подзапрос, вычисляющий объем грузов с группировкой по машинам(ящикам и машинам?)) l
where ...
group by c.name
10 авг 10, 12:14    [9239332]     Ответить | Цитировать Сообщить модератору
 Re: GROUP BY и подзапрос или как их подружить  [new]
STEREOLOVER.CS
Member

Откуда:
Сообщений: 21
SQLap,

Специально для тебя, чтобы было понятнее:


select car.name

from car, box left join load on box.id=load.box_id
where car.id=box.car_id
group by car.name
10 авг 10, 12:16    [9239350]     Ответить | Цитировать Сообщить модератору
 Re: GROUP BY и подзапрос или как их подружить  [new]
==правдолюб==
Guest
а если я назову ТС дибилоидом меня забанят?
10 авг 10, 12:22    [9239407]     Ответить | Цитировать Сообщить модератору
 Re: GROUP BY и подзапрос или как их подружить  [new]
STEREOLOVER.CS
Member

Откуда:
Сообщений: 21
SQLap
STEREOLOVER.CS

А зачем тебе весь запрос?


Хотя бы для того, чтобы посмотреть, как ящики с машинами соединяются.

А так, ответ тоже можно представить в общем виде

select ...
from cars c,
(подзапрос, вычисляющий объем ящиков с группировкой по машинам) b,
(подзапрос, вычисляющий объем грузов с группировкой по машинам(ящикам и машинам?)) l
where ...
group by c.name


Уже вот так не работает:

select car.name, proba

from car c, box b left join load l on b.id=l.box_id,

(select sum(b.height*b.width*b.depth)/1000000
from box b, car c
where b.car_id=c.id
group by c.name) as PROBA

where car.id=box.car_id
group by c.name
10 авг 10, 12:39    [9239568]     Ответить | Цитировать Сообщить модератору
 Re: GROUP BY и подзапрос или как их подружить  [new]
STEREOLOVER.CS
Member

Откуда:
Сообщений: 21
STEREOLOVER.CS
SQLap
STEREOLOVER.CS

А зачем тебе весь запрос?


Хотя бы для того, чтобы посмотреть, как ящики с машинами соединяются.

А так, ответ тоже можно представить в общем виде

select ...
from cars c,
(подзапрос, вычисляющий объем ящиков с группировкой по машинам) b,
(подзапрос, вычисляющий объем грузов с группировкой по машинам(ящикам и машинам?)) l
where ...
group by c.name


Уже вот так не работает:

select car.name, proba

from car c, box b left join load l on b.id=l.box_id,

(select sum(b.height*b.width*b.depth)/1000000
from box b, car c
where b.car_id=c.id
group by c.name) as PROBA

where car.id=box.car_id
group by c.name


Пишет ORA-00933: SQL command not properly ended
10 авг 10, 12:43    [9239602]     Ответить | Цитировать Сообщить модератору
 Re: GROUP BY и подзапрос или как их подружить  [new]
Lecter
Member

Откуда: Киев
Сообщений: 2032
STEREOLOVER.CS,

Поломали мозг. 2 раза from, group by... не знаю просто что и сказать. Один селект вообще без from.
10 авг 10, 12:56    [9239717]     Ответить | Цитировать Сообщить модератору
 Re: GROUP BY и подзапрос или как их подружить  [new]
STEREOLOVER.CS
Member

Откуда:
Сообщений: 21
Вот так тоже не работает:

select car.name, proba, nehochet

from car c,

(select sum(b.height*b.width*b.depth)/1000000 
from box b, car c 
where b.car_id=c.id
group by c.name) as PROBA,

(select sum(l.volume)
from car c, box b left join load l on l.box_id=b.id
where c.id=b.car_id
group by c.name) as NEHOCHET

group by c.name
10 авг 10, 13:24    [9239981]     Ответить | Цитировать Сообщить модератору
 Re: GROUP BY и подзапрос или как их подружить  [new]
Хэнк
Member

Откуда: Днепропетровск
Сообщений: 115
STEREOLOVER.CS, что-то ты наворотил такого....

Вот, тупо в лоб:

select c.name,
       sum(l.volume) load_volume,
       sum(b.height * b.width * b.depth)/1000000 box_volume
from   car c, box b,
       (
       select box_id, sum(volume) volume
       from   load
       group by box_id
       ) l
where  c.id = b.car_id (+)
and    b.id = l.box_id (+)
group by c.name
10 авг 10, 13:43    [9240156]     Ответить | Цитировать Сообщить модератору
 Re: GROUP BY и подзапрос или как их подружить  [new]
STEREOLOVER.CS
Member

Откуда:
Сообщений: 21
Хэнк,
Тупо в лоб не получится, потому что нужно посчитать объём всех ящиков в машине, т.е. если ты укажешь b.id=l.box_id после where, у тебя не выведутся ящики в которых нет грузов. Поэтому то в запросе стоит left join. Если бы было так просто, как ты думаешь, то я бы пост и не делал бы:) Я ещё помозгую над твоим запросом... Может чего полезного из этого извлеку...
10 авг 10, 13:58    [9240287]     Ответить | Цитировать Сообщить модератору
 Re: GROUP BY и подзапрос или как их подружить  [new]
SQLap
Member [заблокирован]

Откуда:
Сообщений: 34063
STEREOLOVER.CS
Если бы было так просто, как ты думаешь, то я бы пост и не делал бы:)


Тебе left join и привели
10 авг 10, 14:00    [9240308]     Ответить | Цитировать Сообщить модератору
 Re: GROUP BY и подзапрос или как их подружить  [new]
STEREOLOVER.CS
Member

Откуда:
Сообщений: 21
SQLap
STEREOLOVER.CS
Если бы было так просто, как ты думаешь, то я бы пост и не делал бы:)


Тебе left join и привели



Вообще ни разу. Сделал всё один в один как рекомендовал Хенк. Этот запрос не работает как left join, чего я и опасался. Сам запрос успешно выводит всё по грузам и считает объём ящиков... да только для ящиков в которых есть хоть одни груз,т.е. объём ящика 4 не учитывается. Ещё предложения?
10 авг 10, 14:30    [9240602]     Ответить | Цитировать Сообщить модератору
 Re: GROUP BY и подзапрос или как их подружить  [new]
Lecter
Member

Откуда: Киев
Сообщений: 2032
STEREOLOVER.CS,

Значит приводи примеры данных как есть и как должно быть.
10 авг 10, 14:33    [9240627]     Ответить | Цитировать Сообщить модератору
 Re: GROUP BY и подзапрос или как их подружить  [new]
идиотывокругнас
Guest
STEREOLOVER.CS

Ещё предложения?

Заканчивай тупить!
Держи еще один вариант, может хоть его поймешь.

select name, sum(box_volume) box_volume, sum(load_volume) load_volume
    from (
            select name, box, max(height*width*depth) box_volume, 0 load_volume
              from t group by name, box, 0
         union all  
            select name, lname, 0 box_volume, sum(volume) load_volume
              from t group by name, lname
          ) group by name
            order by name
10 авг 10, 14:37    [9240666]     Ответить | Цитировать Сообщить модератору
 Re: GROUP BY и подзапрос или как их подружить  [new]
SQLap
Member [заблокирован]

Откуда:
Сообщений: 34063
STEREOLOVER.CS

Этот запрос не работает как left join, чего я и опасался. Сам запрос успешно выводит всё по грузам и считает объём ящиков... да только для ящиков в которых есть хоть одни груз,т.е. объём ящика 4 не учитывается. Ещё предложения?


Этот запрос работает как left join. Но тебе похоже нужен не он.
10 авг 10, 14:38    [9240681]     Ответить | Цитировать Сообщить модератору
 Re: GROUP BY и подзапрос или как их подружить  [new]
STEREOLOVER.CS
Member

Откуда:
Сообщений: 21
Lecter
STEREOLOVER.CS,

Значит приводи примеры данных как есть и как должно быть.


Ну, что вы так невнимательно читаете то :( В топе то всё подробно описывал.

Мой запрос без группировки

select *
from car c, box b left join load l on b.id=l.box_id
where c.id=b.car_id

выводит следующее:

car.name     box.name   box.height box.width box.depth load.name load.volume
жигули ящик 1 20 30 50 корова 0,5
жигули ящик 2 10 50 10 свинья 0,2
ламборгини ящик 3 15 15 20 картошка 0,1
ламборгини ящик 3 15 15 20 морковка 0,15
ламборгини ящик 4 10 10 10 null null


Запрос Хенка без группировки

select *
from   car c, box b,
       (
       select box_id, sum(volume) volume
       from   load
       group by box_id
       ) l
where  c.id = b.car_id (+)
and    b.id = l.box_id (+)

выводит другой результат:

car.name     box.name   box.height box.width box.depth load.name load.volume
жигули ящик 1 20 30 50 корова 0,5
жигули ящик 2 10 50 10 свинья 0,2
ламборгини ящик 3 15 15 20 картошка 0,1
ламборгини ящик 3 15 15 20 морковка 0,15

Обращаю ваше внимание, что информация о ящике 4 отсутствует! Чего я пытаюс до вас донести.
10 авг 10, 14:48    [9240805]     Ответить | Цитировать Сообщить модератору
 Re: GROUP BY и подзапрос или как их подружить  [new]
STEREOLOVER.CS
Member

Откуда:
Сообщений: 21
SQLap
STEREOLOVER.CS

Этот запрос не работает как left join, чего я и опасался. Сам запрос успешно выводит всё по грузам и считает объём ящиков... да только для ящиков в которых есть хоть одни груз,т.е. объём ящика 4 не учитывается. Ещё предложения?


Этот запрос работает как left join. Но тебе похоже нужен не он.


Погоди. Я не придал значения плюсикам в скобках. Не поставил их. Кажется работает и ними. Но честно говоря, смутно понимаю синтаксис. Не подскажите ссылку, где описываются примеры подобного использования? Или хотя бы опишите в общих словах как использовать их.
А в общем спасибо за помощь и участие!
10 авг 10, 15:03    [9241008]     Ответить | Цитировать Сообщить модератору
 Re: GROUP BY и подзапрос или как их подружить  [new]
Хэнк
Member

Откуда: Днепропетровск
Сообщений: 115
STEREOLOVER.CS
Я не придал значения плюсикам в скобках. Не поставил их

Жжошь

(+)
10 авг 10, 15:09    [9241072]     Ответить | Цитировать Сообщить модератору
 Re: GROUP BY и подзапрос или как их подружить  [new]
STEREOLOVER.CS
Member

Откуда:
Сообщений: 21
Хэнк,
Ну, я мягко говоря плохо знаю SQL. Что, собственно говоря, не скрывал.
10 авг 10, 15:35    [9241338]     Ответить | Цитировать Сообщить модератору
 Re: GROUP BY и подзапрос или как их подружить  [new]
Хэнк
Member

Откуда: Днепропетровск
Сообщений: 115
STEREOLOVER.CS
Хэнк,
Ну, я мягко говоря плохо знаю SQL. Что, собственно говоря, не скрывал.

Так а я про это ничего и не говорил. Насмешило твое самоуправство, а не незнание
10 авг 10, 15:59    [9241549]     Ответить | Цитировать Сообщить модератору
 Re: GROUP BY и подзапрос или как их подружить  [new]
STEREOLOVER.CS
Member

Откуда:
Сообщений: 21
Хэнк,

Я немножко ошибся. Всё же разница в работе моего запроса и запроса с left join и твоего есть.

Мой выводит, то что я писал выше, а твой выводит:


car.name     box.name   box.height box.width box.depth 
жигули ящик 1 20 30 50
жигули ящик 2 10 50 10
ламборгини ящик 3 15 15 20
ламборгини ящик 3 15 15 20
ламборгини ящик 4 10 10 10

Но при этом я могу посчитать объём всех грузов и сгруппировать результат. Что собственно мне было удобно и нужно.

Теперь у меня задача посложнее. С которой я тоже не знаю как совладать.

Нужно дополнительно посчитать объём ячеек в которых есть груз. То есть те результаты, что уже есть мне нужны, но дополнительно посчтитать то, что фактически полная противоположность join.

Как бы без сортировки это выглядит так:

car.name     box.name   box.height box.width box.depth load.name load.volume
жигули ящик 1 20 30 50 корова 0,5
жигули ящик 2 10 50 10 свинья 0,2
ламборгини ящик 3 15 15 20 картошка 0,1
ламборгини ящик 3 15 15 20 морковка 0,15

Ну, или так, что не суть:

car.name     box.name   box.height box.width box.depth
жигули ящик 1 20 30 50
жигули ящик 2 10 50 10
ламборгини ящик 3 15 15 20
ламборгини ящик 3 15 15 20

Это как из общего объёма ящиков нужно вычесть объём пустых ящиков или посчитать объём занятых ячеек, что по сути одно и то же. Хэнк, есть идеи?
10 авг 10, 16:15    [9241704]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить