Гость
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка из двух таблиц. / 21 сообщений из 21, страница 1 из 1
17.01.2019, 12:24
    #39760763
savsoft
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка из двух таблиц.
Такой вопрос наверное задавали,но у меня мало знаний найти оптимальный и правильный ответ.
Упрощено есть две таблицы, расходов и приходов.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
CREATE TABLE outputs (
  out_id int(11) NOT NULL AUTO_INCREMENT,
  out_date date DEFAULT NULL,
  out_summa varchar(255) DEFAULT NULL,
  PRIMARY KEY (out_id)
)
ENGINE = INNODB;

CREATE TABLE inputs (
  in_id int(11) NOT NULL AUTO_INCREMENT,
  in_date date DEFAULT NULL,
  in_summa varchar(255) DEFAULT NULL,
  PRIMARY KEY (in_id)
)
ENGINE = INNODB;



В каждый день могут быть несколько приходов/расходов, а может быть ни одного.

======================| in_id | in_date | in_summa |======================| 1 |15.01.2019| 100 |-------------------------------------| 2 |17.01.2019| 150 |-------------------------------------| 3 |17.01.2019| 100 |-------------------------------------| 4 |19.01.2019| 150 |-------------------------------------| 5 |21.01.2019| 100 |---------------------------------- --======================| out_id | out_date |out_summa |======================| 1 |16.01.2019| 200 |--------------------------------------| 2 |17.01.2019| 50 |--------------------------------------| 3 |18.01.2019| 100 |--------------------------------------| 4 |19.01.2019| 150 |--------------------------------------| 5 |19.01.2019| 150 |--------------------------------------

Нужно вывести одним запросом сгруппированные данные по датам и расходам/приходам.

Делаю так

Код: sql
1.
2.
3.
4.
5.
6.
SELECT i.cdate, i.csumma, i.psumma from
(SELECT out_date AS cdate, out_summa AS csumma, NULL AS psumma
FROM outputs
UNION ALL
SELECT in_date, NULL, in_summa
FROM inputs) AS i GROUP BY i.cdate, i.cdate, i.psumma;



автор===================
| cdate | csumma | psumma |
============================
| 15.01.2019 | null | 100 |
-------------------------------------------------
| 16.01.2019 | 200 | null |
-------------------------------------------------
| 17.01.2019 | 50 | null |
-------------------------------------------------
| 17.01.2019 | null | 100 |
-------------------------------------------------
| 17.01.2019 | null | 150 |
-------------------------------------------------
| 18.01.2019 | 100 | null |
-------------------------------------------------
| 19.01.2019 | 150 | null |
-------------------------------------------------
| 19.01.2019 | null | 150 |
-------------------------------------------------
| 21.01.2019 | null | 100 |
-------------------------------------------------

Хочется, чтобы в первой строке на каждую дату, если их больше одной, не было значения null.
19 числа была бы одна строка, а 17 две. Пока это обрабатываю в программе.

Можно ли это сделать в одном запросе?
...
Рейтинг: 0 / 0
17.01.2019, 12:33
    #39760772
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка из двух таблиц.
savsoft
Код: sql
1.
GROUP BY i.cdate, i.cdate, i.psumma;

Какой смысл в дублировании?
savsoft
Код: sql
1.
GROUP BY i.cdate, i.cdate, i.psumma;

Нафига это нужно?
savsoftВ каждый день могут быть несколько приходов/расходовЧто-то я не вижу суммирования - от слова "вообще".

savsoftМожно ли это сделать в одном запросе?
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT i.cdate, SUM(i.csumma) csumma, SUM(i.psumma) psumma 
FROM ( SELECT out_date cdate, out_summa csumma, NULL psumma
       FROM outputs
     UNION ALL
       SELECT in_date, NULL, in_summa
       FROM inputs) i 
GROUP BY i.cdate;
...
Рейтинг: 0 / 0
17.01.2019, 12:44
    #39760784
savsoft
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка из двух таблиц.
Это опечатка, там GROUP BY i.cdate, i.csumma, i.psumma;

Если делать GROUP BY i.cdate, то теряется инфа о каждом приходе/расходе. Суммарный отчет я так и сделал.
А вот развернутый не могу, точнее получается непонятное количество строк двух таблиц. Хотелось бы избавится от избыточных null,
если это возможно.
...
Рейтинг: 0 / 0
17.01.2019, 12:56
    #39760798
paver
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка из двух таблиц.
savsoft,
вряд ли возможно.
Смысл группировок тоже неясен, правильнее дистинктами отсечь дубли и отсортировать по дате общий запрос.
...
Рейтинг: 0 / 0
17.01.2019, 13:03
    #39760807
savsoft
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка из двух таблиц.
paversavsoft,
вряд ли возможно.
Смысл группировок тоже неясен, правильнее дистинктами отсечь дубли и отсортировать по дате общий запрос.

Это как?
...
Рейтинг: 0 / 0
17.01.2019, 13:40
    #39760841
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка из двух таблиц.
savsoftтеряется инфа о каждом приходе/расходе.А надо детально? Тогда указывай точную версию сервера.
...
Рейтинг: 0 / 0
17.01.2019, 13:41
    #39760843
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка из двух таблиц.
paverдистинктами отсечь дублиПосмотри на исходные данные. Это НЕ дубли.
...
Рейтинг: 0 / 0
17.01.2019, 13:46
    #39760851
savsoft
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка из двух таблиц.
Akinasavsoftтеряется инфа о каждом приходе/расходе.А надо детально? Тогда указывай точную версию сервера.

Percona Server
Версия сервера: 5.7.16-10-log - Percona Server (GPL), Release 10, Revision a0c7d0d
...
Рейтинг: 0 / 0
17.01.2019, 14:17
    #39760873
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка из двух таблиц.
savsoft , 5.7 - это плохо, оконные функции недоступны. Тогда читаем FAQ: Нумерация строк и другие вопросы про использование переменных , нумеруем записи в каждой таблице отдельно в группах по дате, после чего объединяем, и итоговый набор группим по дате и номеру.
...
Рейтинг: 0 / 0
17.01.2019, 14:23
    #39760879
savsoft
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка из двух таблиц.
Akina savsoft , 5.7 - это плохо, оконные функции недоступны. Тогда читаем FAQ: Нумерация строк и другие вопросы про использование переменных , нумеруем записи в каждой таблице отдельно в группах по дате, после чего объединяем, и итоговый набор группим по дате и номеру.

Спасибо! Буду разбираться.
...
Рейтинг: 0 / 0
17.01.2019, 14:30
    #39760884
paver
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка из двух таблиц.
Akinapaverдистинктами отсечь дублиПосмотри на исходные данные. Это НЕ дубли.
4 и 5 строки второй таблицы - во вложенном селекте без айдишника дублируются. Именно эта пара и группируется в одну запись результата. Исходных записей 5+5, в результате - 9.
...
Рейтинг: 0 / 0
17.01.2019, 14:33
    #39760887
paver
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка из двух таблиц.
savsoftpaversavsoft,
Смысл группировок тоже неясен, правильнее дистинктами отсечь дубли и отсортировать по дате общий запрос.
Это как?
Внутренние селекты снабдить инструкцией DISTINCT, группировку заменить на ORDER BY по дате.
...
Рейтинг: 0 / 0
17.01.2019, 14:42
    #39760896
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка из двух таблиц.
paver4 и 5 строки второй таблицы - во вложенном селекте без айдишника дублируются.Однако это не дубликаты, а два разных расхода - просто на одинаковую сумму. Объединять их в одну запись нельзя - баланс не сойдётся.
...
Рейтинг: 0 / 0
18.01.2019, 05:23
    #39761221
paver
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка из двух таблиц.
Akinapaver4 и 5 строки второй таблицы - во вложенном селекте без айдишника дублируются.Однако это не дубликаты, а два разных расхода - просто на одинаковую сумму. Объединять их в одну запись нельзя - баланс не сойдётся.
Конечно. Но ТС зачем-то именно это и делает с помощью группировки. Я просто предложил реализовать этот бред более подходящим инструментом.
...
Рейтинг: 0 / 0
18.01.2019, 13:16
    #39761461
savsoft
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка из двух таблиц.
paverAkinaпропущено...
Однако это не дубликаты, а два разных расхода - просто на одинаковую сумму. Объединять их в одну запись нельзя - баланс не сойдётся.
Конечно. Но ТС зачем-то именно это и делает с помощью группировки. Я просто предложил реализовать этот бред более подходящим инструментом.

Ну бред, не бред, а клиент всегда прав. Заказчик захотел именно такой отчет. Есть отчет сгруппированный по дням, то есть дата, клиент, сумма расхода за день, сумма прихода за день и т.д. А заказчик еще не захотел заглядывать в приходы и расходы и захотел такой отчет развернутым. Я сделал это двумя отдельными запросами и обработкой в программе. А вот одним запросом не получилось.
...
Рейтинг: 0 / 0
18.01.2019, 14:16
    #39761503
paver
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка из двух таблиц.
savsoftЕсть отчет сгруппированный по дням, то есть дата, клиент, сумма расхода за день, сумма прихода за день и т.д. А заказчик еще не захотел заглядывать в приходы и расходы и захотел такой отчет развернутым. Я сделал это двумя отдельными запросами и обработкой в программе. А вот одним запросом не получилось.
Второй отчет предполагает не группировку, а сортировку по дате. Группировкой вы убили одну из транзакций (расход в 150 у.е. за 19 число). Вряд ли заказчик имел это в виду.
...
Рейтинг: 0 / 0
18.01.2019, 14:24
    #39761505
savsoft
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка из двух таблиц.
paversavsoftЕсть отчет сгруппированный по дням, то есть дата, клиент, сумма расхода за день, сумма прихода за день и т.д. А заказчик еще не захотел заглядывать в приходы и расходы и захотел такой отчет развернутым. Я сделал это двумя отдельными запросами и обработкой в программе. А вот одним запросом не получилось.
Второй отчет предполагает не группировку, а сортировку по дате. Группировкой вы убили одну из транзакций (расход в 150 у.е. за 19 число). Вряд ли заказчик имел это в виду.

Но с сортировкой и юнион я получаю суммарное количество строк расхода и прихода. А нужно слить строки за один день.

Дата ! Приход ! Расход
---------------------------
д1 ! 100 ! null
---------------------------
д1 ! 150 ! null
---------------------------
д1 ! null ! 50

Вот третья строка должна слиться с первой, типа

Дата ! Приход ! Расход
---------------------------
д1 ! 100 ! 50
---------------------------
д1 ! 150 ! null
---------------------------
...
Рейтинг: 0 / 0
18.01.2019, 14:31
    #39761506
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка из двух таблиц.
Ну так можно получать два отдельных набора, и на клиенте средствами генератора отчётов объединять их на основании номера записи в группе по дате - генератор просто обязан это позволять, ибо он работает с массивом либо коллекцией, где есть позиционность.
Ну или, как по ссылке на FAQ, что я давал выше, делать всё то же на сервере.
...
Рейтинг: 0 / 0
18.01.2019, 14:44
    #39761512
savsoft
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка из двух таблиц.
AkinaНу так можно получать два отдельных набора, и на клиенте средствами генератора отчётов объединять их на основании номера записи в группе по дате - генератор просто обязан это позволять, ибо он работает с массивом либо коллекцией, где есть позиционность.
Ну или, как по ссылке на FAQ, что я давал выше, делать всё то же на сервере.

Программно на клиенте я так и сделал. На примере получить номер записи у меня получилось, а вот на реальном примере пока нет.
...
Рейтинг: 0 / 0
18.01.2019, 14:53
    #39761521
paver
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка из двух таблиц.
[quot savsoft]paverА нужно слить строки за один день.

Я понял, что вы хотите представить отчет в специфической форме. Мне непонятно, почему из двух транзакций (4 и 5 во второй таблице) вы оставляете одну?
...
Рейтинг: 0 / 0
18.01.2019, 15:11
    #39761537
savsoft
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка из двух таблиц.
[quot paver]savsoftпропущено...

Я понял, что вы хотите представить отчет в специфической форме. Мне непонятно, почему из двух транзакций (4 и 5 во второй таблице) вы оставляете одну?

Это ошибка.

Просто ПРИХОД считается по одним таблицам, а РАСХОД по другим. Общее у них дата и клиент. Если делать UNION ALL и группировать по дате, а отчет делается по одному клиенту, то все хорошо. А если в развернутом виде, то получаются строки с приходом и расходом нулл и строки с расходом и приходом нулл. А так как приходов/расходов может быть от 0 до нескольких за каждую дату, то хочется строки за дату, где есть и приход и расход объединить.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка из двух таблиц. / 21 сообщений из 21, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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