У меня есть такая таблица

  • Счет, сумма, x, имя, время
  • 1, 100, деп, bbb, 10
  • 1, 200, деп, bbb, 10
  • 1, 80, остроумие, BBB, 10
  • 1, 90, остроумие, BBB, 10
  • 2, 100, деп, bbb, 20
  • 2, 101, остроумие, BBB, 20
  • 1, 100, деп, ссс, 10
  • 1, 150, остроумие, ccc, 10

Из этого я хочу показать таблицу вроде

  • Имя, Acc, Time, dep_amt, wid_amt, прибыль
  • BBB, 1, 10, 300, 170, 130
  • bbb, 2, 20, 100, 101, -1
  • ccc, 1, 10, 100, 150, -50

Итак, я попробовал присоединиться к себе

SELECT a.Name, a.Acc, a.Time, a.Amount as dep_amt, new.Amount as wid_amt, (a.Amount-new.Amount) as profit
FROM all_data as a, all_data as new
where a.Time = new.Time
and a.name = new.name
and a.acc =new.acc
and a.x= "dep”
and new.x="wit"

Но я не могу использовать с ним Group by (ошибка содержит неагрегированный столбец), и этот sql приводит к таблице с большим количеством строк. Как сделать???

sql
0
Ayan Bhunia 5 Дек 2020 в 12:08

2 ответа

Лучший ответ

Это похоже на условную агрегацию, а не на самосоединение:

select Name, Acc, Time,
       sum(case when x = 'dep' then amount else 0 end) as dep_amt,
       sum(case when x = 'wit' then amount else 0 end) as wit_amt,
       sum(case when x = 'dep' then amount 
                when x = 'wit' then - amount
                else 0
           end) as profit
from t
group by Name, Acc, Time;

Здесь находится скрипт db & lt; & gt;

Самостоятельное присоединение не работает, поскольку в каждой группе есть несколько строк «dep» и «wit». Внутри каждой группы вы получаете декартово произведение этих строк, что приводит к ошибкам в общем вычислении.

1
Gordon Linoff 5 Дек 2020 в 11:59

Похоже, вам нужна условная агрегация.

SELECT name,
       acc,
       time,
       sum(CASE
             WHEN x = 'dep' THEN
               amount
             ELSE
               0
           END) dep_amt,
       sum(CASE
             WHEN x = 'wit' THEN
               amount
             ELSE
               0
           END) dep_wit,
       sum(CASE
             WHEN x = 'dep' THEN
               amount
             ELSE
               0
           END)
       -
       sum(CASE
             WHEN x = 'wit' THEN
               amount
             ELSE
               0
           END) profit
       FROM all_data
       GROUP BY name,
                acc,
                time;
1
sticky bit 5 Дек 2020 в 09:19