powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка из двух таблиц.
21 сообщений из 21, страница 1 из 1
Выборка из двух таблиц.
    #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
Выборка из двух таблиц.
    #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
Выборка из двух таблиц.
    #39760784
savsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это опечатка, там GROUP BY i.cdate, i.csumma, i.psumma;

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

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

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

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

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

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

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

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

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

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

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

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

Это ошибка.

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


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