Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
976 views
in Technique[技术] by (71.8m points)

sql - Complex Postgres query

I have a db schema like following -

(Country table)
| Country | Country Code| 
-------------------------
    ABC         A 
    BCD         B

(Organization Table)

|Organization | Country Code | Organization Code

Org 1            A                O1
Org 2            B                O2
Org 3            A                O3

(Transaction Table)

| Organization | Export(in $) | Import(in $)|

 O1             X1                Y1
 O2             X2                Y2
 O3             X3                Y3

I want the result set to be like this -

| Corridor | Total Export | Total Import |
------------------------------------------
  ABC-BCD      X1+X2+X3       Y1+Y2+Y3

Corridor column should be the combination of all the countries in the Country table.

How can I form a query to implement this logic? Thanks

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

All you need to do is to run an aggregate query:

select sum(t.export) as TotalExport,
sum(t.import) as TotalImport
FROM country c inner join Organization o on c.Country_Code = o.Country_Code
inner join Transaction t on o.organization_code = t.organization_code 

Now, you ask: where is the Corridor column? The answer is: use the string_agg function:

select string_agg(DISTINCT c.country, '-' ORDER BY c.country) as Corridor,
sum(t.export) as TotalExport,
sum(t.import) as TotalImport
FROM country c inner join Organization o on c.Country_Code = o.Country_Code
inner join Transaction t on o.organization_code = t.organization_code 

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...