Модераторы: skyboy

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сложный запрос из многих таблиц 
V
    Опции темы
aleksh
Дата 27.5.2011, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 609
Регистрация: 8.7.2008

Репутация: нет
Всего: 13



никак не получается составить запрос
есть несколько таблиц

Код

tAccount (id, countryid, stateid, fieldid, ...)
tCountry (id, name, ...)
tState (id, countryid, name, ...)
tField (id, name, ...)
tGroups (id, accountid, ...) - сюда входит несколько accountid которые - id из tAccount


и еще несколько, но не в них сложность
нужно как-то выкрутиться, чтобы в итоге выводилось

Код

tCountry.name, tState.name, count(tAccount.id), count(tGroups.accountid), tField.name


база MS SQL
PM MAIL   Вверх
Akina
Дата 27.5.2011, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Смоделируй в Аксессе (подключись к БД из проекта), и воспользуйся визуальным построителем запросов.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
aleksh
Дата 30.5.2011, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 609
Регистрация: 8.7.2008

Репутация: нет
Всего: 13



попробовал, ничего не получилось
по сути
user posted image
вот упрощенная схема
в таблице campaign содержится часть записей из таблицы account
нужно вывести
country.name, state.name, count(account.id), count(campaign.ida)
грубо говоря - страна, область, всего, в работе
если бы в таблицы campaign были указаны country.id и state.id проблем бы не было, задал бы колонку-запрос, где в условии where сравнивал account.idc и campaign.idc, но увы, таких полей нет
возможно ли вообще как-то это выбрать?

Это сообщение отредактировал(а) aleksh - 30.5.2011, 16:21
PM MAIL   Вверх
Akina
Дата 30.5.2011, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Схема - заведомо кривая. Согласно ей одной записи из account можно сопоставить две разных записи из country - одну непосредственно и вторую через state. И контроль целостности это пропустит.
Безотносительно к логике происходящего - в таблице account не должно быть поля idc.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
aleksh
Дата 30.5.2011, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 609
Регистрация: 8.7.2008

Репутация: нет
Всего: 13



кто бы спорил, но "имеем то, что имеем", на сколько могу судить, разработчики продукта сделали так, чтобы при импорте можно было вливать что угодно, а потом уже упорядочивать, или с самого начала сделали криво, а потом было лень дорабатывать
а касательно двух записей, там при вставке из программы через state идет проверка наличия записи в country

а по сути - задачи в принципе реализуема и мне биться дальше, или при данной схеме ничего не выйдет и надо руками править бд (чего делать не хочется)?
PM MAIL   Вверх
Akina
Дата 30.5.2011, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



aleksh, задача в принципе не реализуема именно из-за неоднозначности.
Тебе придётся принять решение о том, что одну из связей в треугольнике следует удалить. Вернее, игнорировать. Только так задачу можно сделать решаемой.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
aleksh
Дата 30.5.2011, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 609
Регистрация: 8.7.2008

Репутация: нет
Всего: 13



хорошо, допустим мы выбросим таблицу country, как быть тогда?
PM MAIL   Вверх
Akina
Дата 30.5.2011, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Если выбросить таблицу - то не получится получить в выходном наборе поле из неё - а оно указано среди получаемых данных.
Выбросить надо одну из трёх связей. Логика требует удалить связь между account и country. И тогда (формально, без смысла происходящего)
Код

SELECT
  country.name
, state.name
, Count(account.id) AS cnt_account_id
, Count(campaign.id) AS cnt_campaign_id
FROM country 
INNER JOIN 
( state 
  INNER JOIN 
  ( campaign 
    INNER JOIN
    account 
    ON campaign.ida = account.id
  ) ON state.id = account.ids
) ON country.id = state.idc
GROUP BY country.name, state.name;



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
aleksh
Дата 30.5.2011, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 609
Регистрация: 8.7.2008

Репутация: нет
Всего: 13



спасибо, но дает одинаковые цифры
логика следующая - есть контакты (все) и это таблица account, к ним привязана информация о них, это таблицы country и state, и еще есть таблица (которая campaign), которая хранит записи о контактах которые нынче в работе (то есть в таблице campaign значений из account меньше чем в первой быть может равное)
нужно выбрать, для отчета старшим товарищам, где будет инфа о контакте, количество всего в бд, и количество тех контактов, которых начали теребить (последняя таблица), беда в том, что если пытаться выбрать тех кто в работе (в последней таблице) то не удается выбрать количество всего
вот как-то так
PM MAIL   Вверх
Akina
Дата 30.5.2011, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



MS SQL, к счастью, поддерживает COUNT(DISTINCT fieldset). Замените...

Добавлено через 5 минут и 5 секунд
Впрочем, это вряд ли поможет - строка с null всё равно строка.
Во-первых, т.к. не каждому acсount соответствует campaign, то связывание должно быть левое. Во-вторых, считать надо только не-NULL строки, что делается обычно не очень изящной заменой COUNT(field) на SUM(CASE WHEN field IS NULL THEN 0 ELSE 1 END)


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
aleksh
Дата 30.5.2011, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 609
Регистрация: 8.7.2008

Репутация: нет
Всего: 13



ладно, пойдем другим путем, будем менять логику отчета
спасибо за участие
PM MAIL   Вверх
Akina
Дата 30.5.2011, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



smile 
Запрос-то почти готов...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
aleksh
Дата 30.5.2011, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 609
Регистрация: 8.7.2008

Репутация: нет
Всего: 13



так ничего не получается
а касательно суммирования - результат тоже не подходящий

PM MAIL   Вверх
Akina
Дата 30.5.2011, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



В аттаче модель в MS Accesss. ИМХО всё соответствует тому, что тебе требуется.
Проверяй.


Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  db.zip 28,70 Kb


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
aleksh
Дата 30.5.2011, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 609
Регистрация: 8.7.2008

Репутация: нет
Всего: 13



хм, действительно, то что надо...
я забыл упомянуть об еще одном условии, которое все портит - в таблице campaign есть поле roleid, и нужно из этой таблицы выбрать только то количество, где это roleid не null, и попытка вставить это условие все портит...
надо было сразу написать

Akina, большое спасибо за уделенное время
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0646 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.