У меня есть такая таблица
- Счет, сумма, 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 приводит к таблице с большим количеством строк. Как сделать???
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». Внутри каждой группы вы получаете декартово произведение этих строк, что приводит к ошибкам в общем вычислении.
Похоже, вам нужна условная агрегация.
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;
Похожие вопросы
Новые вопросы
sql
Язык структурированных запросов (SQL) - это язык запросов к базам данных. Вопросы должны включать примеры кода, структуру таблицы, примеры данных и тег для используемой реализации СУБД (например, MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 и т. Д.). Если ваш вопрос относится исключительно к конкретной СУБД (использует определенные расширения / функции), используйте вместо этого тег этой СУБД. Ответы на вопросы, помеченные SQL, должны использовать стандарт ISO / IEC SQL.