具有多个联接的优化的SQL查询

时间:2019-03-27 20:44:29

标签: sql postgresql join

我正在创建SQL视图。

我有以下内容:

  • 表A:客户帐户信息
  • 表B:与订阅的帐户关系
  • 表C:客户为每个订阅和其他详细信息支付的金额
  • 表D:所有与订阅相关的信息

表A:

AccountNum
Customer_Name
CustomerCode

表B:

SubscriptionId
SubscriptionName
AccountNum

表C:

SubscriptionId
AccountNum
AmountPaid

表D:

SubscriptionId
SubscriptionName

我想输入AccountNum作为输入,并在一次查询中获得不同帐户和订阅详细信息以及“帐户详细信息”下相同帐户的每个帐户的订阅详细信息以及每个订阅的支付金额。

示例:

Table A:
AccountNum   Customer_Name   CustomerCode
1234         TestName        TestCode  
12345        Testname1       TestCode1

Table B:
SubscriptionId  SubscriptionName  AccountNum
12              Netflix           1234
12              Netflix           12345

Table C:
SubscriptionId  AccountNum   AmountPaid
12              1234         100
12              12345        100

Table D:
SubscriptionId  SubscriptionName
12              Netflix 
13              Prime

因此,在上述情况下,帐户编号1234和12345属于一个客户,并且两个帐户都绑定到相同的订阅。因此,我尝试编写一个针对AccountNum#1234的查询作为输入,并在一个查询中从同一客户下的同一客户的不同帐户中获取订阅ID,订阅名称,为同一订阅支付的总金额。

1 个答案:

答案 0 :(得分:0)

您无法执行聚合函数并在与之相反的查询中检索“分组依据”中未使用的字段 您可以使用下面的查询查找每位客户花费的总金额

select 
      a.CustomerCode, 
      sum(case when c.AmountPaid is not null 
               then c.AmountPaid else 0 end) as TotalAmtPaid
   from a
      inner join b
         on a.AccountNum=b.AccountNum
      inner join c
         on a.AccountNum=c.AccountNum
    where 
      a.AccountNum = ?
    group by 
      a.CustCode;

如果您还需要订阅详细信息,则将需要显示多行,每行总金额,这没有意义