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
但它需要很多很多时间(我已经阻止他很长一段时间)
所以我的问题是:是否更好的方式来获得该结果?
谢谢。
@Ion。 。 。这个查询不应该产生那个错误。定义组的唯一列是'nombre',其他表达式都是'SUM()'的参数。 –
是的,你是对的,我不知道为什么当我尝试的东西simillar给我一个错误,因为fecalb不是一个聚合函数。你的答案是完美的。非常感谢你的帮助 – Ion