带有as表达式的SQL显示多个结果



我正在使用with as表达式编写SQL查询。我总是得到一个符合我要求的结果。

这是我的问题:

DECLARE @MAX_DATE AS INT
SET @MAX_DATE = (SELECT DATEPART(MONTH,FECHA) FROM ALBVENTACAB WHERE NUMALBARAN IN (SELECT DISTINCT MAX(NUMALBARAN) FROM ALBVENTACAB));
;WITH TABLE_LAST AS (
SELECT CONCAT(DATEPART(MONTH,FECHA),'-',DATEPART(YEAR,FECHA)) as LAST_YEAR_MONTH
,SUM(TOTALNETO) AS LAST_YEAR_VALUE
FROM ALBVENTACAB
WHERE DATEPART(YEAR,CURRENT_TIMESTAMP) -1 = DATEPART(YEAR,FECHA) AND NUMSERIE LIKE 'A%'
AND DATEPART(MONTH,FECHA) <= @MAX_DATE
GROUP BY CONCAT(DATEPART(MONTH,FECHA),'-',DATEPART(YEAR,FECHA))
)
,TABLE_CURRENT AS(
SELECT CONCAT(DATEPART(MONTH,FECHA),'-',DATEPART(YEAR,FECHA)) as CURR_YEAR_MONTH
,SUM(TOTALNETO) AS CURR_YEAR_VALUE
FROM ALBVENTACAB
WHERE DATEPART(YEAR,CURRENT_TIMESTAMP) <= DATEPART(YEAR,FECHA) AND NUMSERIE LIKE 'A%'
GROUP BY CONCAT(DATEPART(MONTH,FECHA),'-',DATEPART(YEAR,FECHA))
)
SELECT *
FROM TABLE_CURRENT, TABLE_LAST

当我运行查询时,我得到的正是结果的平方。

我想把每月的销售额与去年进行比较。

2-2020  814053.3    2-2019  840295.1
1-2020  1094993.65  2-2019  840295.1
3-2020  293927.3    2-2019  840295.1
2-2020  814053.3    1-2019  1050701.68
1-2020  1094993.65  1-2019  1050701.68
3-2020  293927.3    1-2019  1050701.68
2-2020  814053.3    3-2019  887776.1
1-2020  1094993.65  3-2019  887776.1
3-2020  293927.3    3-2019  887776.1

我应该只得到3行而不是9行。

您需要正确地连接您的两个CTE-按照现在的方式,您将获得任一CTE中每行的笛卡尔乘积

做一些类似的事情:

*;WITH TABLE_LAST AS 
( .... 
),
TABLE_CURRENT AS
( .... 
)
SELECT *
FROM TABLE_CURRENT curr
INNER JOIN TABLE_LAST last ON (some join condition here)

连接条件是什么-我不知道,也不能从你的问题中判断出来-但你必须定义这两组数据";连接"。。。。

它可能类似于:

SELECT *
FROM TABLE_CURRENT curr
INNER JOIN TABLE_LAST last ON curr.CURR_YEAR_MONTH = last.LAST_YEAR_MONT

或者其他在你的情况下有意义的事情——但基本上,你需要以某种方式";"绑在一起";这两组数据,并且只获得那些有意义的行——而不仅仅是"0"中的每一行;最后一个";与来自";curr"。。。。

虽然您已经得到了如何连接这两个结果的答案,但我想告诉您如何典型地处理这些问题。

从同一张表中,您需要在不同条件下(即不同年份(进行两次求和。你可以用条件聚合来解决这个问题,它就是这样做的:基于条件(年(的聚合(总和(。

select
datepart(month, fecha) as month,
sum(case when datepart(year, fecha) = datepart(year, getdate()) then totalneto end) as this_year,
sum(case when datepart(year, fecha) = datepart(year, getdate()) -1 then totalneto end) as last_year
from albventacab
where numserie like 'A%' 
and fecha > dateadd(year, -2, getdate())
group by datepart(month, fecha)
order by datepart(month, fecha);

最新更新