Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.08.2010, 18:26   #1
A-Lex-Is
Пользователь
 
Регистрация: 03.06.2010
Сообщений: 13
По умолчанию Сложный запрос в SQL

Доброго времени суток! Имеется следующая задача:
Есть сеть магазинов в 100 городах России. В одном городе может быть более одного магазина, и всего магазинов 1200. Каждый день, утром, Вам в офис поступает отчётность от каждого магазина вида: Город | Магазин | Фактическая сумма за прошлый день | Планируемая сумма на текущий день.
Вопрос 1. Предполагая, что у Вас есть доступ к MySQL, какую структуру таблиц Вы бы создали для хранения и дальнейшей обработки данных отчётов (Описание полей, скрипты создания, дополнительные комментарии)?
Вопрос2. Зная, что некоторые магазины не присылают отчёты, но должны попасть в Ваш сводный отчёт, какой запрос к созданной в п.1 структуре Вы бы писали, что бы отобразить полную информацию за прошедший день?
Вопрос3. Что необходимо предпринять, если запрос в п.2 выполняется недопустимо долго?
Прошу помочь того, кто сможет. Буду очень благодарен.
A-Lex-Is вне форума Ответить с цитированием
Старый 10.08.2010, 23:19   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Если один магазин не может быть расположен одновременно в двух городах,
тогда рекомендую связь в таблице МАГАЗИН foreign key ID_CITY - ссылка на таблицу ГОРОД (месторасположение магазина)
ну, таблицу ЕЖЕДНЕВНЫЙ_ОТЧЁТ Вы уже описали: там обязательно должны быть:
Дата_Отчёта
ID_Магазин
(город не нужен, т.к. на город ссылка получается через МАГАЗИН)

вопрос 2.
Простейший запрос:
Код:
SELECT ID_Магазин,  SUM(Fact_Sum) as SFact,
  SUM(Plan_Sum) as SPlan from ОТЧЁТЫ
  WHERE ОТЧЁТЫ.Дата_Отчёта = CURDATE()
  GROUP BY  ID_Магазин
или, если хотите увидеть и те магазины, которые не прислали отчёт за текущий день, то можно добавить через UNION:
Код:
SELECT ID_Магазин,  SUM(Fact_Sum) as SFact,
  SUM(Plan_Sum) as SPlan from ОТЧЁТЫ
  WHERE ОТЧЁТЫ.Дата_Отчёта = CURDATE()
  GROUP BY  ID_Магазин
UNION 
Select ID_Магазин,  0 as SFact,
  0 as SPlan from МАГАЗИН 
  where ID_Магазин not in (
     SELECT ID_Магазин from ОТЧЁТЫ
  WHERE ОТЧЁТЫ.Дата_Отчёта = CURDATE())
вопрос 3. А с чёго Вы решили, что запрос будет выполняться недопустимо долго?!
Добавьте индексы на ключевые поля, на foreign key поля,
ну, я бы ещё добавил индекс на поле ДАТА_ОТЧЁТА в таблице ОТЧЁТЫ
и всё...
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вопросам знатокам и просто любителям, нужно составить не сложный sql запрос modz SQL, базы данных 3 14.08.2013 11:20
Сложный запрос nikolai_P SQL, базы данных 2 01.04.2010 01:21
SQL запрос из двух таблиц.(сложный) Miha87 БД в Delphi 5 10.11.2008 11:04
сложный sql запрос kate158 БД в Delphi 0 18.09.2008 11:38
Сложный SQL-запрос ole777 БД в Delphi 1 08.05.2007 20:56