powered by simpleCommunicator - 2.0.18     © 2024 Programmizd 02
Map
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Комбинирование таблиц и сумма
10 сообщений из 10, страница 1 из 1
Комбинирование таблиц и сумма
    #40005434
Серега Г
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет.

Столкнувшись с торговлей, понял, что плохо представляю, как работает group by, sum, и left join. Если всё по-отдельности, то предельно ясно. Итак, имеем:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE TABLE eupds (
    date     DATE,
    num      TEXT,
    inncontr TEXT,
    sumtotal FLOAT
);

CREATE TABLE payments (
    num   INT   UNIQUE,
    date  DATE,
    inn   INT,
    summ  FLOAT
);


Соответственно, таблица с суммами купленных товаров от разных поставщиков, и таблица оплат. Мне нужно совместить по каждому контрагенту суммарно, сколько поступило товара и сколько оплачено. Делаю

Код: sql
1.
2.
3.
select inn, sum(summ) payed, sum(eupds.sumtotal) from payments, eupds
where payments.inn=eupds.inncontr
group by inn


Цифры получаются сильно завышенные, по сравнению если делать запросы отдельно:
Код: sql
1.
2.
3.
4.
5.
select inn, sum(summ) payed from payments
group by inn;

select inncontr, sum(eupds.sumtotal), sum(eupds.sumcash) from eupds
group by inncontr;



Как правильно? во всех ли СУБД так, или это только в sqlite так ?
...
Рейтинг: 0 / 0
Комбинирование таблиц и сумма
    #40005437
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Серега Г
Как правильно? во всех ли СУБД так, или это только в sqlite так ?

Правильно делать отдельными запросами. В любой реляционной СУБД.

PS Советую почитать какую-нибудь книжку по основам SQL. Join не для того чтобы меньше букв писать.
...
Рейтинг: 0 / 0
Комбинирование таблиц и сумма
    #40005444
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Серега Г

where payments.inn=eupds.inncontr

Серега Г

inncontr TEXT,
inn INT,


???

За такое убивать нужно. IMHO
...
Рейтинг: 0 / 0
Комбинирование таблиц и сумма
    #40005446
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
Серега Г

where payments.inn=eupds.inncontr

Серега Г

inncontr TEXT,
inn INT,


???

За такое убивать нужно. IMHO

В SQLite прокатит, тут типы автоматом в зависимости от значения выбираются. Правда я не понимаю зачем их тогда вообще задавать.
...
Рейтинг: 0 / 0
Комбинирование таблиц и сумма
    #40005448
Серега Г
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsev,

Понятное дело, если бы я где-то в публичном проекте или где-то у работодателя так написал. Этот минипроектик чисто для себя, для сокращения "мышещёлкания". И я не думаю, что разница в типах в этих таблицах приводит к дублированию суммируемых записей. Так вопрос, почему они дублируются?
В основах по SQL нигде не встречал особенностей использования join и агрегатных функций совместно с group by.
...
Рейтинг: 0 / 0
Комбинирование таблиц и сумма
    #40005451
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Серега Г
В основах по SQL нигде не встречал особенностей использования join и агрегатных функций совместно с group by.

Одно другому не мешает. Чтобы понять что суммируется - убери group by и посмотри
Код: sql
1.
select inn, summ payed, eupds.sumtotal from payments, eupds where payments.inn=eupds.inncontr



JOIN можно делать только ключевым полям, читай теорию.

PS Если очень хочется одним запросом, то используй те два запроса как подзапросы.
...
Рейтинг: 0 / 0
Комбинирование таблиц и сумма
    #40005474
Серега Г
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T, хм. Конкретно в этом случае получается, что суммируется декартово произведение между первой таблицей и второй. ХМ, но это я "упростил" при публикации поста. В реале у меня есть ещё таблица contragents, в которой поле inn является primary key, ну и выходит, что при подтягивании данных из "правой" таблицы, данные "левой" дублируются, если в "правой" несколько строк, содержащих PK с "левой". Непонятно, почему так происходит. Ну а так да, к подзапросам я пришёл, получается то, что надо.
...
Рейтинг: 0 / 0
Комбинирование таблиц и сумма
    #40005478
Агрох
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У тебя получается связь многие ко многим. Как следствие - дублирование строк.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
tbl1
id||Val1
1||10
1||15
2||22

tbl2
id||Val2
1||78
1||23
2||55



При объединении по id, каждой строке с id=1 из первой таблицы проставиться каждая строка с id=1 из 2-й таблицы, получим:
Код: sql
1.
2.
3.
4.
5.
6.
id_tbl1||idtbl2||Val1||Val2
1||1||10||78
1||1||10||23
1||1||15||78
1||1||15||23
2||2||22||55



Ну и как бы что будет если просуммировать столбцы?
...
Рейтинг: 0 / 0
Комбинирование таблиц и сумма
    #40005481
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Серега Г
В реале у меня есть ещё таблица contragents

Это неважно, добавление этой таблицы в запрос ничего не меняет. Нельзя join`ить к одному PK несколько FK с разных таблиц.
...
Рейтинг: 0 / 0
Комбинирование таблиц и сумма
    #40005489
Серега Г
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Агрох, вот, неочевидно, почему многие ко многим. По задумке - присоединение таблиц один ко многим. Я думал, что в результате будут строки с первой таблицы (в ней инн является первичным ключом), а дальше присоединяться строки из второй и третьей таблицы, заполняя поля не своей таблицы значением null (а они не null заполняются), а в итоге выходит, 1й join отрабатывает, и становиться "левой таблицей" для следующего join, поэтому и "многие ко многим"...

Всем спасибо! Тему можно закрывать.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Комбинирование таблиц и сумма
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (1): Анонимы (1)
Читали форум (3): Анонимы (2), Yandex Bot 7 мин.
Пользователи онлайн (10): Анонимы (6), Bing Bot 1 мин., RePredeclared 3 мин., Yandex Bot 6 мин., CerebroSQL 6 мин.
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]