Привет, у меня есть таблица, в которой мне нужны 4 столбца: «sell_currency», «sell_amount», «buy_currency» и «buy_amount». Столбцы валюты имеют формат varchar, а сумма — числа, и я хочу вычислить сумму суммы по ее валюте, поэтому для получения результатов я использую следующий SQL-код:
select
sell_currency,
sum(sell_amount) as sell_amount
null as buy_currency
null as buy_amount
from table1
group by
sell_currency
union
select
null as sell_currency,
null as sell_amount,
buy_currency,
sum(buy_amount) as buy_amount
from table1
group by
buy_currency
И с данными из таблицы1:
SELL_CURRENCY SELL_AMOUNT BUY_CURRENCY BUY_AMOUNT
A 123 D 1
B 234 E 2
B 345 D 3
A 222 (null) 0
C 4444 (null) 0
И вот какой результат я получаю из таблицы:
SELL_CURRENCY SELL_AMOUNT BUY_CURRENCY BUY_AMOUNT
A 345 (null) (null)
B 579 (null) (null)
C 4444 (null) (null)
(null) (null) D 4
(null) (null) E 2
Однако я хочу удалить эти нули и объединить строки для достижения результата, показанного ниже:
SELL_CURRENCY SELL_AMOUNT BUY_CURRENCY BUY_AMOUNT
A 345 D 4
B 579 E 2
C 4444 (null) (null)
Что мне нужно сделать, чтобы добиться результата?
И для получения дополнительной информации, эти 4 столбца также часто обновляются, поэтому при продаже и покупке может быть более 3 или 2 уникальных валют.
Пожалуйста, добавьте образец входных данных к вашему вопросу.
привет @jarlh Я удалил sum() для обеих сумм, изменил его на UNION ALL и завернул sql в другую группу select from to by с помощью Sell_currency и buy_currency, но результат остался тем же.
@Джонас, извини, Джонас, я все еще новичок в публикации сообщений о переполнении стека, что ты под этим имеешь в виду?
К сожалению, не так много других данных, которые имеют отношение к этому (даже идентификатор), хотя в таблице есть столбец sort_order, который предназначен для упорядочивания таблицы.
Конечно, есть и другие данные. Ваши запросы суммируют данные, поэтому исходные данные, скорее всего, будут отличаться. Например, для валюты А ваш запрос возвращает сумму 345 в качестве суммы продажи. Никто не знает, являются ли входные данные в вашей таблице одной строкой с 345 или 100 строками со значениями 3 или 4 или также строками со значениями NULL
. Пожалуйста, не используйте комментарии для обсуждений, а отредактируйте свой вопрос и добавьте недостающую информацию. Входные данные нужны ВСЕГДА, см. также stackoverflow.com/help/minimal-reproducible-example
Это кажется ненужным усложнением базовой операции соединения. Не могли бы вы предоставить содержание table1?
Вам нужен не союз, а объединение.
select currency, s.sell_amount, b.buy_amount
from
(
select sell_currency as currency, sum(sell_amount) as sell_amount
from table1
group by sell_currency
) s
full outer join
(
select buy_currency as currency, sum(buy_amount) as buy_amount
from table1
group by buy_currency
) b using (currency)
order by currency;
Спасибо, хотя это работает и показывает общую сумму продажи и покупки для каждой валюты, насколько сложно разбить ее на четыре столбца, где валюта разделена на Sell_currency и buy_currency?
В строках результатов валюта продажи равна валюте покупки, так зачем же показывать ее дважды? Но вы, конечно, можете: select currency as sell_curr, s.sell_amount, currency as buy_curr, b.buy_amount ...
. Или сохраните исходные имена столбцов и используйте ON sell_currency = buy_currency
вместо USING (currency)
.
Ах, я только что заметил, что мой запрос не дает желаемого результата. Вы хотите отобразить строки с произвольно смешанными валютами. Не делай этого. SQL — это отношения. Но Sell_currency A не связана с buy_currency D, как следует из вашего результата. Если в вашем графическом интерфейсе вы хотите иметь список сумм в валюте продажи и список сумм в валюте покупки, выберите два набора данных отдельно и в идеале используйте две сетки для отображения или, если вы считаете это необходимым, заполните одну сетку данные сверху вниз.
Понятно, если это так, то я так и сделаю. Спасибо за подробное объяснение!
Сначала СОЕДИНЕНИЕ ВСЕХ, затем ГРУППИРОВАНИЕ ПО.