Форум программистов, компьютерный форум, киберфорум
Наши страницы
MySQL
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Yorik1994
0 / 0 / 0
Регистрация: 24.01.2013
Сообщений: 43
1

Особенности оператора Join

21.04.2016, 14:35. Просмотров 869. Ответов 7
Метки sql (Все метки)

Приветствую.
В запросе мне необходимо выбрать данные из нескольких таблиц. Когда я подключаю оператором join вторую таблицу к первой, у меня сбивается сумма, которую я выбираю, а именно вырастает до немыслимых значений. Пробовал разные join-ы, группировки, оператор distinct, ничего не помогло решить проблему.
Поэтому интересуюсь, это проблема с join-ами или проблема базы данных?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.04.2016, 14:35
Ответы с готовыми решениями:

Описание оператора JOIN
MySQL оператор JOIN Часто вижу на форуме проблемы связанные с объединением в...

Запросы RIGHT JOIN и LEFT JOIN в чём различие?
Добрый день! Чем отличаются запросы RIGHT JOIN и LEFT JOIN, если они выдают...

Необычный join (применить условие where для первой таблицы, а потом where для результата join)
мне нужно прежде чем джоинить, применить условие where для первой таблицы. а...

Особенности аутентификации в системах управления базе данных
Добрый день:senor: Хотелось бы узнать где можно почитать про "Особенности...

JOIN
Как сделать запрос к БД : есть 2 таблицы с одинаковой структурой (a int, b...

7
Grossmeister
Модератор
3408 / 2461 / 419
Регистрация: 21.01.2011
Сообщений: 10,789
21.04.2016, 15:08 2
Цитата Сообщение от Yorik1994
это проблема с join-ами
Поскольку на практике редко бывают запросы из одной таблицы, обычно из нескольких, то проблемы c join быть не может, иначе с такой СУБД работать было бы невозможно. Так что лучше ты покажи свои варианты (не забудь структуру таблиц), чтобы можно было найти ошибки в твоих запросах.
0
Yorik1994
0 / 0 / 0
Регистрация: 24.01.2013
Сообщений: 43
21.04.2016, 15:54  [ТС] 3
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SELECT SUM(salessum) AS salessum 
FROM 
(
SELECT 
  CASE 
    WHEN (sales.SALESTAG=2 AND sales.SALESREFUND=0 AND sales.SALESCANC=0)
       THEN (sales.SALESSUM/100) 
  END salessum,
  sales.SALESTIME AS salestime, sales.SAREAID AS sareaid, sales.SYSTEMID AS systemid
FROM SALES JOIN CASHIO 
  ON sales.SAREAID=cashio.SAREAID 
   AND sales.SYSTEMID=cashio.SYSTEMID 
   AND sales.SESSID=cashio.SESSID
WHERE sales.SALESTIME>=20160411000000 
   AND sales.SALESTIME<=20160412235959 
   AND sales.SAREAID=6 
   AND sales.SYSTEMID=2
) a
GROUP BY SAREAID, SYSTEMID, 
SUBSTRING(SALESTIME,7,2)+SUBSTRING(salestime,5,2)+SUBSTRING(salestime,1,4)
0
Yorik1994
0 / 0 / 0
Регистрация: 24.01.2013
Сообщений: 43
21.04.2016, 16:01  [ТС] 4
Структура таблиц:
0
Миниатюры
Особенности оператора Join   Особенности оператора Join  
Grossmeister
Модератор
3408 / 2461 / 419
Регистрация: 21.01.2011
Сообщений: 10,789
21.04.2016, 16:15 5
1. в данном случае (когда есть только сумма и больше ничего) группировка не требуется вообще, особенно такая странная
2. проверь внутренний запрос на предмет, не дублирует ли он строки. Для этого проще всего отсортировать его по какому-то характерному полю (лучше если уникальному). Если дублирует, значит не хватает каких-то условий либо в ON, либо в WHERE
3. несколько странно выглядит CASE. Если условие соблюдается, то получаем некое число, а если нет? Обычно д.б. ветка ELSE
0
Yorik1994
0 / 0 / 0
Регистрация: 24.01.2013
Сообщений: 43
21.04.2016, 16:20  [ТС] 6
1. Группировка необходима для вывода, по каждому дню должна выводиться своя сумма.
3. в else прописывал 0.
SQL
1
CASE WHEN (sales.SALESTAG=2 AND sales.SALESREFUND=0 AND sales.SALESCANC=0) THEN (sales.SALESSUM/100) ELSE 0 END salessum
Так вроде можно делать.
Остается дерзать второй пункт) спасибо
0
Grossmeister
Модератор
3408 / 2461 / 419
Регистрация: 21.01.2011
Сообщений: 10,789
21.04.2016, 16:25 7
Лучший ответ Сообщение было отмечено Yorik1994 как решение

Решение

Цитата Сообщение от Yorik1994 Посмотреть сообщение
Группировка необходима для вывода, по каждому дню должна выводиться своя сумма
Тогда у тебя неверно построен запрос. В данном случае у тебя группировка находится на уровне, где одно единственное число - общая сумма. Т.е. она фактически не работает. Поэтому надо те поля, по которым выполняется группировка, выводить из подзапроса на внешний уровень.
1
Yorik1994
0 / 0 / 0
Регистрация: 24.01.2013
Сообщений: 43
21.04.2016, 16:35  [ТС] 8
Похоже что костыль таился именно в группировке. Поставил правильную группировку и прописал distinct, сумма правильная вывелась)
Спасибочки ещё раз
0
21.04.2016, 16:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.04.2016, 16:35

Join VS in
Люди, здравствуйте. До сих пор не знаю, как правильно искать в таблице...

Like в Inner Join
Скажите, а можно ли использовать Like в конструкции Inner Join, для того, чтобы...

JOIN
Утро доброе! Смотрю урок по SQL, в нем показывают как можно использовать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru