【问题标题】:Comparing differences (error) between two tables in SQL比较 SQL 中两个表之间的差异(错误)
【发布时间】:2012-12-14 20:42:11
【问题描述】:

我想计算结构完全相同但数据不一定相同的两个表的行之间的增量。

表 1(预测)

标识 |姓名 |全科医生 |克|一个

表1(实际数据)

标识 |姓名 |全科医生 |克|一个

结果(由 Id 匹配):

标识 | (GP1-GP2) AS DeltaGP | (G1-G2) 作为 DeltaG | (A1-A2) 作为 DeltaA |

赶上我的漂移?这是为了计算SSAS中预测模型的误差

这是我的代码:

    SELECT P.[Player_id]
          ,P.[PlayerName]
          ,sum(P.[Games Played])-sum(S.[GamesPlayed]) AS GP
          ,sum(P.[Total Goals])-sum(s.[TotalGoals]) AS Goals
          ,sum(P.[Total Assists])-sum(s.[TotalAssists]) AS Assists   
FROM [PredictionsPlayersHistory] as P   
JOIN [V_StatsPlayers] AS S on p.pLAYER_id = s.Player_id    
where S.LastPlayedDate >= '2010-02-01' and P.Player_id
    = 8471675   group by P.[Player_id],P.[PlayerName]   
order by Goals desc, Assists desc, GP asc

问题是结果不对:

预测 (SUM)

球员姓名 GP 进球助攻数

西德尼·克罗斯比 56 28 34

实际数据(总和)

球员姓名 GP 进球助攻数

西德尼·克罗斯比 26 17 24

结果

西德尼·克罗斯比 28 -42 -98

【问题讨论】:

  • 您是按Id 分组的,所以每个Id 必须有多个预测和结果?如果是这种情况,请确保您确认您的预期结果与“预测”和“实际”匹配是正确的。如果只有一个预测,则不要使用“分组依据”,因为它只会混淆问题。

标签: sql tsql delta


【解决方案1】:

需要在id列上加入两个表:

SELECT a.Id,a.Name, a.GP - p.GP AS DeltaGP, a.G - p.G AS DeltaG,  a.A - p.A AS DeltaA
FROM dbo.table1 AS a --actual values
JOIN dbo.table2 AS p --predictions
ON a.Id = p.Id;

有关 SQL Server 联接的介绍,请查看我的帖子系列:http://sqlity.net/en/1146/a-join-a-day-introduction/


编辑:如果每个表中的每个玩家都有多行,则需要在加入之前聚合它们:

SELECT  a.Id,
        a.Name,
        a.GP - p.GP AS DeltaGP,
        a.G - p.G AS DeltaG,
        a.A - p.A AS DeltaA
FROM    (
          SELECT  Id,
                  Name,
                  SUM(GP) AS GP,
                  SUM(G) AS G,
                  SUM(A) AS A
          FROM    dbo.table1
          GROUP BY Id,
                  Name
        ) AS a --actual values
JOIN    (
          SELECT  Id,
                  SUM(GP) AS GP,
                  SUM(G) AS G,
                  SUM(A) AS A
          FROM    dbo.table2
          GROUP BY Id
        ) AS p
        --predictions
  ON a.Id = p.Id;

根据您的要求,您可能希望使用 AVG 而不是 SUM。

【讨论】:

    【解决方案2】:

    您可以按 ID 连接表吗?如果我猜对了:

    SELECT table1.id, table1.name,
           (table1.gp - table2.gp) as DeltaGP,
           (table1.g - table2.g) as DeltaG,
           (table1.a - table2.a) as DeltaA
    FROM table1
    JOIN table2
    ON table1.id = table2.id
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-04
      • 1970-01-01
      • 2015-04-06
      相关资源
      最近更新 更多