【问题标题】:Calculating percent change from one record to next using a SQL query使用 SQL 查询计算从一条记录到下一条记录的百分比变化
【发布时间】:2012-07-06 16:57:49
【问题描述】:

我正在使用此查询来计算从当前学期到上一学期的入学总数百分比变化。我需要对此查询进行哪些更改以避免空值? 我尝试过使用非常慢的子查询。

SELECT E2.Term AS Prev_Term, 
       E2.[Enrollment Total] AS Prev_Enrl_Tot, 
       E1.Term,
       E1.Location, 
       E1.milestone_description, 
       E1.polling_date,
       Round(((E1.[Enrollment Total] - [Prev_Enrl_Tot]) 
                                   / [Prev_Enrl_Tot]) * 100,2) AS Percent_Change
FROM EnrollmentsByLocation E1 
LEFT OUTER JOIN EnrollmentsByLocation E2
ON E1.Location = E2.Location 
AND E1.milestone_description = E2.milestone_description 
AND E1.Term - E2.Term = 1;

【问题讨论】:

  • 您是要在百分比计算中避免空值(将空值替换为 0)还是要同时避免包含空值的行(使用 where 子句消除空行)?
  • 不能只用 0 替换空行(例如,用 COALESCE),你会得到一个被零除的错误。如果前一个术语不存在,那会使百分比变化 100% - 那么您是否应该使用简单的 CASE 语句并仅输出 100?
  • 你说你想避免 NULL,但你没有说你想要什么行为。
  • 将左外连接更改为连接。这样,您将只获得匹配的记录。
  • 内连接成功了!!谢谢@GordonLinoff

标签: sql join null


【解决方案1】:

什么味道的SQL?避免空值是什么意思?您是要避免除以零错误,还是不显示空值?使用ISNULL,但将NULLIF 包裹在除数周围以避免除以零错误。这两者都处理。 或者您是否试图阻止他们返回?如果是这样,请查看您的 LEFT 连接或 WHERE 子句。 您需要将别名放在 [Prev_Enrl_Tot] 上。

 ISNULL(Round(((E1.[Enrollment Total] - [Prev_Enrl_Tot]) / NULLIF([Prev_Enrl_Tot],0)) * 100,2),0) AS Percent_Change

【讨论】:

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