2017-07-26 45 views
1

我有两个表,第一个是关于客户信息的表格,第二个包含来自客户(客户,albarán_cliente)的销售,您可以看到结构here,我需要的是获得客户名单,1年前销售2年的另一个专栏,以及1年前至今的销售额。无效的子查询SQL Server

事情是这样的:

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 

但表现很烂,所以我尝试另一种选择, 我阅读和使用过尝试(分区) ,但它似乎并没有为我工作,然后我试图使用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 

但它需要很多很多时间(我已经阻止他很长一段时间)

所以我的问题是:是否更好的方式来获得该结果?

谢谢。

回答

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; 
+0

@Ion。 。 。这个查询不应该产生那个错误。定义组的唯一列是'nombre',其他表达式都是'SUM()'的参数。 –

+0

是的,你是对的,我不知道为什么当我尝试的东西simillar给我一个错误,因为fecalb不是一个聚合函数。你的答案是完美的。非常感谢你的帮助 – Ion