SQL - у меня есть таблица «People» и таблица «Account». Как мне перечислить всех людей в строках и иметь столбец баланса для каждого типа аккаунта? - PullRequest
0 голосов
/ 16 мая 2018

Мне было трудно понять, как озаглавить этот вопрос, поэтому я заранее извиняюсь.

Вот моя ситуация:

У меня есть одна таблица, в которой только людиЭто.У меня есть другая таблица, в которой есть все учетные записи, с 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 ]

0 голосов
/ 16 мая 2018

Примерно так должно работать для 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

sqlfiddle пример

0 голосов
/ 16 мая 2018
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
0 голосов
/ 16 мая 2018

Проверьте, помогает ли это -

http://sqlfiddle.com/#!4/30ebb/10/0

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
...