Фирма занимается приемом вторсырья и имеет несколько пунктов приема. Каждый пункт получает деньги для их выдачи сдатчикам в обмен на сырье. Фактически, на схеме представлены две базы данных. В каждой задаче по этой схеме используется только одна пара таблиц (либо с суффиксом «_o», либо без него). В таблицах Income_o и Outcome_o первичным ключом является пара атрибутов {point, date} - номер пункта приема и дата. Этот ключ должен моделировать ситуацию, когда сведения о получении денег на приемном пункте и их выдаче сдатчикам записываются в базу данных не чаще одного раза в день.
Запрос:Определить лидера по сумме выплат в соревновании между каждой парой пунктов с одинаковыми номерами из двух разных таблиц - outcome и outcome_o - на каждый день, когда осуществлялся прием вторсырья хотя бы на одном из них. Вывод: Номер пункта, дата, текст:- "once a day", если сумма выплат больше у фирмы с отчетностью один раз в день;- "more than once a day", если - у фирмы с отчетностью несколько раз в день;- "both", если сумма выплат одинакова.
Уже очень длительное время думаю, как сделать его без использования Full Join и Intersect. В сети есть решение на Transact-SQL:
select case when o1.point is null then o2.point else o1.point end,
case when o1.date is null then o2.date else o1.date end,
case
when o1.out is null and o2.out is not null
then 'more than once a day'
when o2.out is null and o1.out is not null
then 'once a day'
when o2.out is null and o1.out is null
then 'both'
when o1.out > o2.out then 'once a day'
when o1.out < o2.out then 'more than once a day'
when o1.out = o2.out then 'both'
else 'both' end
from
(select point, date, out from outcome_o
where (point in (select distinct point from outcome
intersect
select distinct point from outcome_o))) as o1
full join
(select point, left(convert(varchar, date, 121), 10) as date, sum(out) as out
from outcome
where (point in (select distinct point from outcome
intersect
select distinct point from outcome_o))
group by point, left(convert(varchar, date, 121), 10)) as o2
on left(convert(varchar, o1.date, 121), 10) = o2.date and (o1.point = o2.point)
Тот кто это писал для MS SQL перемудрил. intersect
вообще крайне редко нужен и в данном случае он заменяется обычным join
. Что касается full join
- то в MySQL его нет, часто вместо него используется union
с представлением данных из разных таблиц в разных колонках и последующий group by
. В нашем случае его вдобавок можно совместить с подсчетом суммы по дате.
select A._point, dt, sum(_out) o1, sum(out_o) o2,
case
when sum(_out) > sum(out_o) then 'once a day'
when sum(_out) < sum(out_o) then 'more than once a day'
else 'both'
end
from (
select _point, date(_date) as dt, _out, 0 as out_o
from Outcome
union all
select _point, date(_date) , 0, _out
from Outcome_O
) A
join (select distinct a._point from Outcome a, Outcome_O b where a._point=b._point) B
on A._point=B._point
group by A._point, dt
Виртуальный выделенный сервер (VDS) становится отличным выбором
Итогом возвращается только набор из ALL, без today
Есть произвольные таблицы и необходимо узнать название поля c PRIMARY KEY, как это можно сделать SQL (использую MySQL) запросом или средствами Python v3 и библиотечки...
Нужно написать API, и у клиента есть примеры запросов, которые должны быть