SQL - у меня есть таблица "People" и таблица "Account". Как мне перечислить всех людей в строках и иметь столбец баланса для каждого типа аккаунта?
Мне было трудно понять, как озаглавить этот вопрос, поэтому заранее извиняюсь.
Вот моя моя ситуация:
У меня есть один стол, в котором только люди. У меня есть другая таблица, в которой есть все учетные записи, с personID, accountType и столбцом баланса. Человек может иметь несколько учетных записей, есть разные типы учетных записей, и не у всех есть все различные типы учетных записей.
Как я могу написать запрос, в котором я перечисляю по одному человеку в строке и иметь столбец для баланса каждого "типа счета"?
В идеале мой запрос должен выглядеть примерно так:
PersonID | Account Type 1 Bal | Account Type 2 Bal | Account Type 3 Bal |
-------------------------------------------------------------------------
1 | $100 | null | null |
2 | null | $12 | $1300 |
3 | null | null | $5 |
4 | $150 | null | null |
5 | $65 | $300 | $45 |
Я предположил бы, что использовал бы какое-то утверждение, но я еще не смог понять это. Кроме того, если они имеют несколько одинакового типа учетной записи, я предполагаю, что я бы просто использовал sum() правильно?
Благодарю.
3 ответа
Нечто подобное должно работать на postgres
select p.person_id,
(select sum(a.balance) from account a where a.person_id = p.person_id and a.account_type = 'Type1') type1_balance,
(select sum(a.balance) from account a where a.person_id = p.person_id and a.account_type = 'Type2') type2_balance,
(select sum(a.balance) from account a where a.person_id = p.person_id and a.account_type = 'Type3') type3_balance
from person p
select personid
,sum(ac1bal) accounttype1bal
,sum(ac2bal) accounttype2bal
,sum(ac3bal) accounttype3bal
from (
select persontable.personid
,case when (accounttype=1) then bal end ac1bal
,case when (accounttype=2) then bal end ac2bal
,case when (accounttype=3) then bal end ac3bal
from persontable
left join accounttable on persontable.personid = accounttable.personid
)
group by personid
Проверьте, помогает ли это -
CREATE TABLE person
("person_id" int, "name" varchar2(9))
;
INSERT ALL
INTO person ("person_id", "name")
VALUES (1, '''Abcd''')
INTO person ("person_id", "name")
VALUES (2, '''xyz''')
INTO person ("person_id", "name")
VALUES (3, '''jjjjj''')
INTO person ("person_id", "name")
VALUES (4, '''sfds''')
INTO person ("person_id", "name")
VALUES (5, '''temp''')
SELECT * FROM dual
;
CREATE TABLE accounts
("personID" int, "accountType" int, "balance" int)
;
INSERT ALL
INTO accounts ("personID", "accountType", "balance")
VALUES (1, 1, 100)
INTO accounts ("personID", "accountType", "balance")
VALUES (1, 2, 150)
INTO accounts ("personID", "accountType", "balance")
VALUES (2, 1, 20)
INTO accounts ("personID", "accountType", "balance")
VALUES (3, 1, 40)
INTO accounts ("personID", "accountType", "balance")
VALUES (3, 2, 440)
INTO accounts ("personID", "accountType", "balance")
VALUES (4, 1, 600)
INTO accounts ("personID", "accountType", "balance")
VALUES (5, 1, 43)
INTO accounts ("personID", "accountType", "balance")
VALUES (5, 2, 50)
SELECT * FROM dual
;
Запрос -
select * from (
select p."person_id", a."accountType", a."balance"
from person p, accounts a
where p."person_id" = a."personID"
)
pivot (sum("balance") for "accountType" in (1 as acc_type1_bal,2 as acc_type2_bal));
person_id ACC_TYPE1_BAL ACC_TYPE2_BAL
1 100 150
2 20 (null)
4 600 (null)
5 43 50
3 40 440