在进行表关联时,理想的情况是多张表的原表数据直接可以进行关联,形成关联结果。
在特殊情况下,需要对原始表的记录进行提前处理,将处理之后的结果再进行关联,以保证关联之后结果的正确性。
聚合关联就是一种比较常见的场景,即将每张表分别先进行聚合处理,然后按照对应关联字段将聚合结果进行关联。
例如,有两张原始明细表,分别是销售记录表和成本记录表。每个客户有多个订单,每个订单有多条销售记录,每个订单对应多条成本记录,销售记录和成本记录是多对多的关系,需要计算每个客户、每个订单的销售额、成本、毛利和毛利率,不能直接进行两表关联,直接关联数据会出现冗余。
Sql脚本:
select t1.*,t2.成本,t1.销售金额-t2.成本 as 毛利,
/*计算毛利率*/
case when t1.销售金额=0 then 0 else (t1.销售金额-t2.成本)/t1.销售金额 end as 毛利率 from (
/*按照客户、订单号对销售额进行聚合*/
select [CUSTOMER NAME],SUBSTRING([JOB],5,LEN([JOB])-4) 订单号,SUM(amount) 销售金额 from 销售记录
group by [CUSTOMER NAME],SUBSTRING([JOB],5,LEN([JOB])-4)
) t1
left join
/*聚合结果进行关联*/
(
/*按照客户、订单号对成本进行聚合*/
select [CUSTOMER NAME],SUBSTRING([JOB],5,LEN([JOB])-4) 订单号,SUM(amount) 成本 from 成本记录
group by [CUSTOMER NAME],SUBSTRING([JOB],5,LEN([JOB])-4)
) t2
on t1.[CUSTOMER NAME]=t2.[CUSTOMER NAME] and t1.订单号=t2.订单号