2016-07-14 68 views
1

不一致值为了在同一行中显示较前期一些记录,我有我的表连接到自己是这样的:自连接生成上个月

SELECT 
     a.[periodOrderNum] 
     ,SUM(a.AktivNy) as ActiveNew 
     ,SUM(b.[AktivNy]) as ActiveNewPrevMonth 
    FROM myTable a 
    JOIN myTable b 
    ON a.customerSNKey = b.customerSNKey 
    AND a.periodOrderNum = b.periodOrderNum + 1 
    GROUP BY a.[periodOrderNum] 

在上面的代码periodOrderNum是订单编号分配给期间。例如,如果当前时间段是5,则前一时间段的订单号为4.

customerSNKey是客户的序列号密钥,我将其用作我的JOIN条件之一。其他条件(a.periodOrderNum = b.periodOrderNum + 1)我用来获取前一期的价值。但结果并不一致。正如下面的图片中看到,订单号280的ActiveNewPrevMonth值为20203这不是订单号码279.

enter image description here

ActiveNew值什么我在我加入做错了什么?

+1

很难说,因为没有显示所有的数据。我会在没有连接的情况下运行查询,并使用“AND periodOrderNum = 280”来查看它试图进行SUM操作的情况,只是为了确保。你可以将这些结果添加到你的问题吗? –

+0

组成一些数据并显示DDL,输入,输出和预期输出。阅读[mcve]并采取行动。 PS如果没有上个月的数据会怎么样? – philipxy

回答

1

没有一些示例数据,我不知道哪里出了问题。但无论如何,无论如何,您的查询将返回错误的值,我相信。假设您的periodOrderNum下有多行,您的ActiveNew值几乎可以保证被夸大。如何尝试将它们分成子查询,如下所示:

SELECT a.[periodOrderNum] 
,a.ActiveNew 
,b.ActiveNewPrevMonth 
FROM 
(
SELECT 
customerSNKey, [periodOrderNum] 
,SUM(AktivNy) as ActiveNew 
FROM myTable 
GROUP BY customerSNKey, [periodOrderNum] 
) AS a 
INNER JOIN 
(
SELECT 
customerSNKey, [periodOrderNum] + 1 as [periodOrderNum] 
,SUM(AktivNy) as ActiveNewPrevMonth 
FROM myTable 
GROUP BY customerSNKey, [periodOrderNum] + 1 
) AS b 
ON a.customerSNKey = b.customerSNKey 
AND a.[periodOrderNum] = b.[periodOrderNum] 
+0

对不起。无法访问数据库atm。我会尽快回复你。 – Disasterkid

+0

嗨,很抱歉,很长的延迟。你的查询只给了我0和1作为'ActiveNew'和'ActiveNewPrevMonth'。我希望我可以帮你提供一些样本数据,但我恐怕我不能这样做。 – Disasterkid