Как объединить столбцы, если есть пустые ячейки

Привет, у меня есть таблица, в которой мне нужны 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 02.04.2024 13:03

Пожалуйста, добавьте образец входных данных к вашему вопросу.

Jonas Metzler 02.04.2024 13:13

привет @jarlh Я удалил sum() для обеих сумм, изменил его на UNION ALL и завернул sql в другую группу select from to by с помощью Sell_currency и buy_currency, но результат остался тем же.

ifsoMarcus 02.04.2024 13:22

@Джонас, извини, Джонас, я все еще новичок в публикации сообщений о переполнении стека, что ты под этим имеешь в виду?

ifsoMarcus 02.04.2024 13:23

К сожалению, не так много других данных, которые имеют отношение к этому (даже идентификатор), хотя в таблице есть столбец sort_order, который предназначен для упорядочивания таблицы.

ifsoMarcus 02.04.2024 13:32

Конечно, есть и другие данные. Ваши запросы суммируют данные, поэтому исходные данные, скорее всего, будут отличаться. Например, для валюты А ваш запрос возвращает сумму 345 в качестве суммы продажи. Никто не знает, являются ли входные данные в вашей таблице одной строкой с 345 или 100 строками со значениями 3 или 4 или также строками со значениями NULL. Пожалуйста, не используйте комментарии для обсуждений, а отредактируйте свой вопрос и добавьте недостающую информацию. Входные данные нужны ВСЕГДА, см. также stackoverflow.com/help/minimal-reproducible-example

Jonas Metzler 02.04.2024 13:37

Это кажется ненужным усложнением базовой операции соединения. Не могли бы вы предоставить содержание table1?

Niqua 02.04.2024 13:42
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
7
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам нужен не союз, а объединение.

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?

ifsoMarcus 02.04.2024 14:06

В строках результатов валюта продажи равна валюте покупки, так зачем же показывать ее дважды? Но вы, конечно, можете: select currency as sell_curr, s.sell_amount, currency as buy_curr, b.buy_amount ... . Или сохраните исходные имена столбцов и используйте ON sell_currency = buy_currency вместо USING (currency).

Thorsten Kettner 02.04.2024 14:12

Ах, я только что заметил, что мой запрос не дает желаемого результата. Вы хотите отобразить строки с произвольно смешанными валютами. Не делай этого. SQL — это отношения. Но Sell_currency A не связана с buy_currency D, как следует из вашего результата. Если в вашем графическом интерфейсе вы хотите иметь список сумм в валюте продажи и список сумм в валюте покупки, выберите два набора данных отдельно и в идеале используйте две сетки для отображения или, если вы считаете это необходимым, заполните одну сетку данные сверху вниз.

Thorsten Kettner 02.04.2024 14:21

Понятно, если это так, то я так и сделаю. Спасибо за подробное объяснение!

ifsoMarcus 02.04.2024 14:26

Другие вопросы по теме