我有2个表,第一个是包含客户信息的表,第二个包含来自客户的销售商(clientes,albarán_cliente),您可以看到结构here,我需要的是获得一个客户名单,另一列直至1年前销售2年,以及从1年前开始直到今天的另一列销售。
这样的事情:
Customers Sales_from_2_years_ago_to_1_year_ago sales_from_1_year_ago_to now
---------- --------------------------------------- ---------------------------
aaa 1000 2000
bbb 850 900
ccc 20000 15000
我可以通过子查询获得这个:
select
c.nombre, (select sum(acc.importe)
from CLIENTES cc
join ALBARAN_CLIENTE acc on acc.codcli = cc.codcli
where fecalb > DATEADD(MONTH, -24, cast(getdate() as date))
and fecalb < DATEADD(MONTH, -12, cast(getdate() as date))
and cc.NOMBRE = c.NOMBRE
group by cc.NOMBRE )[de -24 a -12 meses],
(select sum(acc.importe) from CLIENTES cc join ALBARAN_CLIENTE acc on acc.codcli=cc.codcli
where fecalb>DATEADD(MONTH,-12,cast(getdate() as date)) and
fecalb<cast(getdate() as date) and cc.NOMBRE=c.NOMBRE group by cc.NOMBRE)[de -12 a 0 meses]
from CLIENTES c join ALBARAN_CLIENTE ac on ac.codcli=c.codcli
where fecalb>DATEADD(MONTH,-24,cast(getdate() as date))
group by c.NOMBRE
但性能很糟糕,所以我尝试了其他选择,
我阅读并尝试使用over(partition),但它似乎对我不起作用,然后我尝试使用WITH
:
WITH EQ AS
( select cc.nombre,sum(acc.importe)[suma1]
from CLIENTES cc join ALBARAN_CLIENTE acc on acc.codcli=cc.codcli
where fecalb>DATEADD(MONTH,-24,cast(getdate() as date))
and fecalb<DATEADD(MONTH,-12,cast(getdate() as date))
group by cc.NOMBRE
)
, EQ2 AS
(select cc.nombre,sum(acc.importe)[suma2]
from CLIENTES cc join ALBARAN_CLIENTE acc on acc.codcli=cc.codcli
where fecalb>DATEADD(MONTH,-12,cast(getdate() as date))
and fecalb<cast(getdate() as date) group by cc.NOMBRE
)
SELECT c.nombre, suma1,suma2
from CLIENTES c join ALBARAN_CLIENTE ac on ac.codcli=c.codcli
left join EQ on EQ.NOMBRE=c.NOMBRE left join EQ2 on EQ2.NOMBRE=c.NOMBRE
where fecalb>DATEADD(MONTH,-24,cast(getdate() as date))
group by c.NOMBRE,suma1,suma2
但是需要更多的时间(很长一段时间后我已经阻止了他)
所以我的问题是:是获得该结果的更好方法吗?
感谢。
答案 0 :(得分:3)
是。使用条件聚合:
select cc.nombre,
sum(case when fecalb > DATEADD(MONTH, -24, cast(getdate() as date)) and
fecalb < DATEADD(MONTH, -12, cast(getdate() as date))
then acc.importe else 0
end) as suma1,
sum(case when fecalb > DATEADD(MONTH, -12, cast(getdate() as date)) and
fecalb < cast(getdate() as date)
then acc.importe else 0
end) as suma2
from CLIENTES cc join
ALBARAN_CLIENTE acc
on acc.codcli = cc.codcli
group by cc.NOMBRE;