Объединение трех и более таблиц
nvetal
Дата: 24.02.2008 12:35:02
Требуется сформировать отчет следующего вида
Клиент | Заказов всего | Заказов успешно | Заказов со скидкой
Данные получаются из двух таблиц - Клиенты и заказы. Соединение - по искусственному ключу Код у таблицы Клиент и Клиент у таблицы Заказы. Т.к. нужно получить в том числе и данные с нулями - использую левое соединение.
Вопрос в следующем, как получить сразу ВСЕ данные.
Т.е. если использовать запрос типа
SELECT Клиенты.Название, Count(Заказы.Код) AS Кол_усп
FROM Клиенты LEFT JOIN Заказы ON Клиенты.КодКлиента = Заказы.Клиент
WHERE (((Заказы.Дата) Between #1/8/2007# And #8/30/2007# Or (Заказы.Дата) Is Null))
GROUP BY Клиенты.Название
ORDER BY Клиенты.Название;
То будет всего две колонки - Имя клиента и общее число заказов.
Как сюда же присоединить и общее число успешных заказов (по флагу Успешно) и заказы со скидкой(по флагу дисконт), т.е. сделать объединение трех таблиц?
proposed amendment
Дата: 24.02.2008 12:47:14
nvetal |
Как сюда же присоединить и общее число успешных заказов (по флагу Успешно) и заказы со скидкой(по флагу дисконт), т.е. сделать объединение трех таблиц? |
отказаться от лишней и не нужной таблицы - это первое что приходит в голову
nvetal
Дата: 24.02.2008 13:29:03
а какая таблица здесь лишняя - если их всего две? Клиенты или заказы?
Трех таблиц - имелось введу объединить таблицы три раза с учетом различных условий отбора...
вариант
Дата: 24.02.2008 13:32:07
использовать подзапросы или DCount в SELECT-e
будет медленно но верно :)
вариант2
Дата: 24.02.2008 13:48:18
nvetal |
Как сюда же присоединить и общее число успешных заказов (по флагу Успешно) и заказы со скидкой(по флагу дисконт)...? |
Если поля [Успешно] и [дисконт] - логические, то попробуйте добавить в запрос поля
Abs(Sum([Успешно])) As Количество_успешно и Abs(Sum([дисконт])) As Количество_дисконт
вариант2 ремикс
Дата: 24.02.2008 13:58:23
если дисконт не логическое то
abs(sum(cint(cbool(discont))))
proposed amendment
Дата: 24.02.2008 14:05:26
угу... все как всегда...
надоело уже... когда же вам-то надоест?
nvetal
Дата: 24.02.2008 14:08:39
Увы, все более сложно. Дисконт - текстовое. Содержит номер дисконтной карты. Если пустое - значит нет дисконта.
На данный момент этот отчет формируется, но используется запрос в цикле. Вот и хотелось бы как-нибудь оптимизировать чтоб за один раз сразу все данные хапнуть-)
.
Дата: 24.02.2008 14:14:53
вариант2 + 2-ремикс с iif
все "хапается" в одном запросе
без IIf
Дата: 24.02.2008 14:21:48
Abs(Sum(Nz([дисконт],"")<>"")) As Количество_дисконт