【问题标题】:New Column with average by Date in SQL ServerSQL Server 中按日期平均的新列
【发布时间】:2015-05-18 17:18:30
【问题描述】:

我有这张桌子:

OrganizationCode | CreatedDate              | TotalCost
102              |  2015-05-18 00:00:00.000 | 200
102              |  2015-05-18 00:00:00.000 | 550
102              |  2015-05-15 00:00:00.000 | 700
102              |  2015-05-15 00:00:00.000 | 1200
103              |  2015-01-27 00:01:12.720 | 1275,46
103              |  2015-01-27 00:01:12.720 | 1275,46 
103              |  2015-01-27 00:01:12.720 | 1275,46

我需要添加两列:

每日平均值 = 按日期计算的值的总和

每日金额 = 按日期计算的金额

我想要下面的结果:

OrganizationCode | CreatedDate      | TotalCost | Daily Average | Daily Amount    
-----------------|------------------|-----------|---------------|--------    
102              | 2015-05-18 00:00 | 200       | 375           |  2    
102              | 2015-05-18 00:00 | 550       | 375           |  2    
102              | 2015-05-15 00:00 | 700       | 950           |  2    
102              | 2015-05-15 00:00 | 1200      | 950           |  2    
103              | 2015-01-27 00:01 | 1275,46   | 1275,46       |  3    
103              | 2015-01-27 00:01 | 1275,46   | 1275,46       |  3    
103              | 2015-01-27 00:01 | 1275,46   | 1275,46       |  3

我试试这个查询:

   SELECT OrganizationCode 
          , CreatedDate 
          , (SELECT avg(TotalCost) AS x
                 FROM #TempLocalOrg
                 Group By CAST(CreatedDate as date)) 
   FROM #TempLocalOrg 

没有成功,子选择有效,但我需要复制结果

【问题讨论】:

  • 你已经尝试过了,对吧?有什么问题?与我们分享您的 SQL 查询。
  • 看来每日平均和每日金额的值来自临时表#TempLocalOrg。您能否也将此表架构添加到问题中?
  • 对不起,我的第一篇文章。它包括查询。它是一个临时表,但在这种情况下可以视为普通表。

标签: sql sql-server average


【解决方案1】:

最好的方法是使用窗口函数:

SELECT OrganizationCode, CreatedDate
     , AVG(TotalCost) OVER ( PARTITION BY CreatedDate ) AS [Daily Average]
     , COUNT(*) OVER ( PARTITION BY CreatedDate ) AS [Daily Amount]
  FROM #TempLocalOrg;

以上假设日期被四舍五入或截断到最近的一天。

【讨论】:

  • 如果它们还没有被截断到日期级别,你可以这样做partition by cast(createddate as date)
【解决方案2】:
SELECT OrganizationCode 
      , CreatedDate 
      , TotalCost
      , aggregates.AvgCost AS 'Daily Average '
      , aggregates.CountCost AS 'Daily Amount'
FROM #TempLocalOrg tmp
CROSS APPLY
(
   SELECT AVG(TotalCost) as AvgCost
         ,COUNT(1) AS CountCost
   FROM #TempLocalOrg crossTemp
   WHERE CAST(tmp.CreatedDate as date) = CAST(crossTemp.CreatedDate as date)
) aggregates

由于您不需要汇总值,因此我们无法使用 group by。 相反,我使用 CROSS APPLY 来匹配每一行的 Date 并聚合它的结果,以便将其应用于每一行不同的行。 如果您需要任何澄清,请随时与我联系。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-05
    • 2014-06-04
    • 1970-01-01
    • 2012-05-06
    • 1970-01-01
    • 2023-04-04
    • 2018-10-28
    相关资源
    最近更新 更多