Sql 自联接为上个月生成不一致的值

Sql 自联接为上个月生成不一致的值,sql,tsql,join,Sql,Tsql,Join,为了在同一行中显示上个月的一些记录,我必须像这样将我的表连接到表本身: 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

为了在同一行中显示上个月的一些记录,我必须像这样将我的表连接到表本身:

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]
 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]
在上述代码中,periodOrderNum是分配给period的订单号。例如,如果当前期间为5,则前一期间的订单号为4

customerSNKey
是客户的序列号密钥,我将其用作我的
JOIN
条件之一。另一个条件(
a.periodOrderNum=b.periodOrderNum+1
)用于获取上一个期间的值。但结果并不一致。如下图所示,对于订单号280,
ActiveNewPrevMonth
的值为20203,而不是订单号279的
ActiveNew


我在加入时做错了什么?

没有一些示例数据,我无法判断哪里出错了。但不管怎样,我相信您在这里的查询都会返回错误的值。假设您在同一
periodOrderNum
下有多行,那么您的
ActiveNew
值肯定会被夸大。试着将它们分成如下子查询如何:

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]
 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]

很难说,因为所有的数据都没有显示出来。我将在不使用联接的情况下运行查询,并使用“and periodOrderNum=280”查看它试图求和的值,只是为了确保。你能把这些结果添加到你的问题中吗?制作一些数据并显示DDL、输入、输出和预期输出。阅读并付诸行动。如果没有上个月的数据怎么办?对不起。无法访问db atm。我会尽快回复你的。嗨,很抱歉耽搁了这么久。您的查询只给了我0和1作为
ActiveNew
ActiveNewPrevMonth
。我希望我能帮你提供一些样本数据,但恐怕我不能。