【问题标题】:Get percentage over two years in SQL Server query在 SQL Server 查询中获取超过两年的百分比
【发布时间】:2012-05-21 12:25:11
【问题描述】:

我想使用 SQL Server 查询基本上计算两年内的百分比差异。

由于某种原因,当我在年份字段上使用 -1 时,它返回 null。

如果我不在当年做 -1,我目前所拥有的工作,但显然它返回 100%,因为它是今年与今年的比较,而不是今年与上一年的比较。

这是我的查询:

SELECT Year, 
       Sum(Amount) 
       AS Total, 
       (SELECT Sum(Amount) 
        FROM   Purchases 
        WHERE  Purchases.Year = Budgets.Year) 
       AS Actual, 
       ( ( (SELECT Sum(Amount) 
            FROM   Purchases 
            WHERE  Purchases.Year = Budgets.Year) / Sum(Amount) ) * 100 ) 
       AS 
       BudgetPercentage, 
       ( (SELECT Sum(Amount) 
          FROM   Budgets 
          WHERE  Budgets.Year = Budgets.Year) / (SELECT Sum(Amount) 
                                                 FROM   Budgets 
                                                 WHERE  Budgets.Year = ( 
                                                        Budgets.Year - 1 
                                                                       )) * 100 
       ) AS 
       PerYearPercentage 
FROM   Budgets 
WHERE  ServiceStationId = 1 
GROUP  BY Year 

问题在于 Budgets.Year - 1,知道我可以做些什么来获得想要的结果吗?

【问题讨论】:

  • Budgets.Year 是什么数据类型? varchar?诠释?日期时间?
  • 那么,您想将每年年与其前身进行比较,对吗?
  • 抱歉,还有一个问题。主查询使用过滤器 (ServiceStationId = 1),但您计算 PerYearPercentage 的子查询没有该过滤器。这是故意的还是无意的遗漏?
  • 目前它是设计使然,最后我还没有完全测试它,并且可能会导致逻辑错误,因为我可能会比较不正确的值,我目前的首要任务是能够计算出这个百分比

标签: sql-server subquery where-clause


【解决方案1】:

快速解决您的查询的方法是向计算 PerYearPercentage 的子查询中的表添加不同的别名:

SELECT Year, 
       Sum(Amount) 
       AS Total, 
       (SELECT Sum(Amount) 
        FROM   Purchases 
        WHERE  Purchases.Year = Budgets.Year) 
       AS Actual, 
       ( ( (SELECT Sum(Amount) 
            FROM   Purchases 
            WHERE  Purchases.Year = Budgets.Year) / Sum(Amount) ) * 100 ) 
       AS 
       BudgetPercentage, 
       ( (SELECT Sum(Amount) 
          FROM   Budgets b
          WHERE  b.Year = Budgets.Year) / (SELECT Sum(Amount) 
                                           FROM   Budgets b
                                           WHERE  b.Year = (Budgets.Year - 1)) * 100 
       ) AS 
       PerYearPercentage 
FROM   Budgets 
WHERE  ServiceStationId = 1 
GROUP  BY Year 

【讨论】:

  • 谢谢你成功了,我现在需要添加的是用于检查所有子查询中的 servicestationid 的 where 子句,感谢一百万它完美地工作
猜你喜欢
  • 1970-01-01
  • 2022-12-05
  • 2017-08-31
  • 1970-01-01
  • 1970-01-01
  • 2021-01-29
  • 1970-01-01
  • 2021-06-22
  • 1970-01-01
相关资源
最近更新 更多