子查询SQL Server无效

时间:2017-07-26 11:39:41

标签: sql sql-server

我有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

但是需要更多的时间(很长一段时间后我已经阻止了他)

所以我的问题是:是获得该结果的更好方法吗?

感谢。

1 个答案:

答案 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;