Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Группировка по двум полям (+ JOIN)
 
 автор: Volmir   (23.09.2009 в 11:16)   письмо автору
 
 

Бьюсь второй день над задачей по MySQL - не могу решить!
Единственное (некорректное) решение, которое у меня получилось (через UNION и "ручное" прописывание 2х фирм в запросе, а ведь их может быть больше!)

SELECT c.name, g.name, SUM( s.quantity )
FROM company c
JOIN shipment s ON c.compid = s.compid
JOIN goods g ON g.goodid = s.goodid
WHERE c.compid=1
GROUP BY g.goodid
UNION
SELECT c.name, g.name, SUM( s.quantity )
FROM company c
JOIN shipment s ON c.compid = s.compid
JOIN goods g ON g.goodid = s.goodid
WHERE c.compid=2
GROUP BY g.goodid

Помогите, пожалуйста. В какую сторону смотреть, где искать ответ?

---------------------------------------------------------------------------

Задача.

Вывести общий объем поставок каждого из продуктов для каждой фирмы
с указанием даты последней поставки.

Дамп таблиц:

create table company (compid int identity(1,1) primary key, name nvarchar(100) not null)
create table goods (goodid int identity(1,1) primary key, name nvarchar(100) not null)
create table shipment (shipid int identity(1,1) primary key, compid int not null, goodid int not null, quantity
float not null, shipdate datetime not null)

set identity_insert company on
insert company (compid, name) values (1, 'Intel')
insert company (compid, name) values (2, 'IBM')
insert company (compid, name) values (3, 'Compaq')
set identity_insert company off

set identity_insert goods on
insert goods (goodid, name) values (1, 'Pentium IV')
insert goods (goodid, name) values (2, 'Celeron')
set identity_insert goods off

insert shipment (compid, goodid, quantity, shipdate) values (1, 1, 100, '02/04/2004')
insert shipment (compid, goodid, quantity, shipdate) values (1, 1, 200, '02/12/2004')
insert shipment (compid, goodid, quantity, shipdate) values (1, 2, 300, '03/02/2004')
insert shipment (compid, goodid, quantity, shipdate) values (1, 2, 400, '03/09/2004')
insert shipment (compid, goodid, quantity, shipdate) values (2, 1, 100, '01/29/2004')
insert shipment (compid, goodid, quantity, shipdate) values (2, 1, 200, '02/06/2004')
insert shipment (compid, goodid, quantity, shipdate) values (2, 2, 300, '02/29/2004')
insert shipment (compid, goodid, quantity, shipdate) values (2, 2, 400, '03/01/2004')

  Ответить  
 
 автор: cheops   (23.09.2009 в 12:19)   письмо автору
 
   для: Volmir   (23.09.2009 в 11:16)
 

Что в строке
compid int identity(1,1) primary key

означает identity(1,1)? А также откуда взялся nvarchar? Это точно MySQL?

  Ответить  
 
 автор: cheops   (23.09.2009 в 12:22)   письмо автору
 
   для: Volmir   (23.09.2009 в 11:16)
 

И почему в таблице shipment первичный ключ дублируется?

  Ответить  
 
 автор: Trianon   (23.09.2009 в 12:54)   письмо автору
 
   для: Volmir   (23.09.2009 в 11:16)
 

по-моему, так...
SELECT  g.name, c.name, SUM( s.quantity ), MAX(s.shipdate)
  FROM shipment s 
    JOIN   goods g ON g.goodid = s.goodid
    JOIN company c ON c.compid = s.compid
  GROUP BY g.goodid, g.name, c.compid, c.name
  ORDER BY c.name, g.name

а лучше - так

SELECT c.name, g.name, q, d
  FROM 
  (
    SELECT  goodid, compid, SUM( quantity ) AS q , MAX(s.shipdate) AS d
      FROM shipment s 
        GROUP BY goodid, compid
  ) AS t 
    LEFT JOIN   goods g ON g.goodid = t.goodid
    LEFT JOIN company c ON c.compid = t.compid
  ORDER BY c.name, g.name


только в дампе и вправду не MySQL.

  Ответить  
 
 автор: Volmir   (23.09.2009 в 13:36)   письмо автору
 
   для: Trianon   (23.09.2009 в 12:54)
 

Спасибо!

Особенно понравилось решение с вложенным запросом (осмысливаю его сейчас).

Честно говоря, я не додумался попробовать сгруппировать данные по 2-м полям сам (GROUP BY g.goodid, c.compid), подумал, что в этом случае MySQL выдаст ошибку, так как группировка может осуществляться по 1-му полю. Оказалось, что можно группировать по нескольким полям ...

Дамп неизвестно с какой базы - мне его прислали.
У мнея на 5-м Мускуле загрузился корректно (создались таблицы и вставились данные).

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования