【问题标题】:SUM rows by week syntax按周语法求和行
【发布时间】:2017-06-08 10:06:04
【问题描述】:

我正在使用以下查询

SELECT CONVERT(date,lot.Killdate) as KillDate
  ,lot.[LotNo]
  ,lot.[HotWeight]
  ,lot.[AverageYieldGrade]
  ,(lot.HeadShorn + lot.HeadUnshorn) as 'Total'
  ,(lot.HotWeight) / (lot.HeadShorn + lot.HeadUnshorn) as 'AvgWeight'  
  ,date.Date
  ,date.WeekOfYear
FROM [LambLot].[dbo].[LotHeader] lot, Master_Dim.dbo.DateDim date
WHERE CONVERT(date,lot.KillDate) = date.Date 
and lot.KillLocation = 1 
AND lot.HeadShorn > 0
AND lot.HeadUnshorn > 0
AND date.Year = 2016
group by lot.LotNo, lot.HeadShorn, lot.HeadUnshorn, lot.HotWeight lot.AverageYieldGrade, lot.KillDate, date.Date, date.WeekOfYear
order by date.WeekOfYear asc

这是输出的副本

    KillDate    LotNo   HotWeight   AverageYieldGrade   Total   AvgWeight           Date        WeekOfYear
1   2016-01-04  102     21603.5     2.28                348     62.0790229885057    2016-01-04  2
2   2016-01-04  103     2305.3      1.42                53      43.4962264150943    2016-01-04  2
3   2016-01-04  105     1159        0                   17      68.1764705882353    2016-01-04  2
4   2016-01-04  108     1493.6      0                   39      38.2974358974359    2016-01-04  2
5   2016-01-04  109     2982.8      0                   80      37.285              2016-01-04  2

我想做的是将每一行汇总到一年中的一周。基本上给了我 52 行输出,显示了每列中每个值的总和。有没有办法做到这一点?

【问题讨论】:

  • 类似... select datepart(yy,datecolumn) as YearNum, datepart(wk,datecolumn) as WeekNum, sum(someColumn) from someTable group by datepart(yy,datecolumn), datepart(wk,datecolumn)

标签: sql sql-server-2012 group-by sum


【解决方案1】:

如果您只需要通过WeekOfYear 发送SUM,则只需一年中的一周发送GROUP BY。您必须决定如何处理其他值,这是一种可能有意义的方法(通过一些预期的输出,您会更容易找出您真正在寻找什么):

SELECT CONVERT(date, MAX(lot.Killdate)) as KillDate
  ,MAX(lot.[LotNo]) -- ?? Does this really belong in this query?
  ,SUM(lot.[HotWeight])
  ,AVG(lot.[AverageYieldGrade])
  ,(SUM(lot.HeadShorn) + SUM(lot.HeadUnshorn)) as 'Total'
  ,SUM(lot.HotWeight) / (SUM(lot.HeadShorn) + SUM(lot.HeadUnshorn)) as 'AvgWeight'  
  ,MAX(date.Date)
  ,date.WeekOfYear
FROM [LambLot].[dbo].[LotHeader] lot, Master_Dim.dbo.DateDim date
WHERE CONVERT(date,lot.KillDate) = date.Date 
and lot.KillLocation = 1 
AND lot.HeadShorn > 0
AND lot.HeadUnshorn > 0
AND date.Year = 2016
group by date.WeekOfYear
order by date.WeekOfYear asc

请记住:您GROUP BY 的任何列都将被考虑到如何计算出不同的组。 GROUP BY 中没有的任何内容,但在输出中想要的内容只需要某种聚合函数(例如 MINMAXAVGSUMCOUNT 等)。

【讨论】:

  • 优秀的评论@Dan Field。我没有意识到为了从 group by 语句中删除列,我必须添加一个聚合函数。这很棒。谢谢!!
猜你喜欢
  • 2020-07-26
  • 2020-09-16
  • 1970-01-01
  • 2017-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-22
  • 2020-09-21
相关资源
最近更新 更多