【问题标题】:Summing rows only if they're within a week of each other仅当它们彼此相隔一周内时才对行求和
【发布时间】:2019-12-11 04:09:36
【问题描述】:

我有一张包含 ProductID、日期和价格的表格。我正在尝试编写以下代码:

  • 确定每种产品销量最高的那一周
  • 忽略 productid,找出销售额最大化的周数,即 将所有日期分成 7 天期间,以便在每 7 天内 期间销售额最大化。这些 7 天的周期是不允许的 重叠

我真的是 SQL 新手,我已经为此苦苦挣扎了几天,并查看了堆栈溢出问题。在第一个任务中,我认为我找到了理想的代码,但它似乎对其他人有用,但只返回给定日期的产品销售额,而不是一周的总和。

Select a.date, a.productid, sum(sales) from 
 (SELECT [Date Of Sale] as 'Date'
  ,[Product ID] as 'ProductID'
  , [Sales in GBP] as 'Sales'
 FROM [blah].[blah-blah])
) as a
  where a.date between dateadd(day, -6, a.date) and dateadd(day, 0, a.date)
  group by a.date, a.productid;

我已尝试调整到必要的内容,但没有错误消息,它只返回日期、productid、销售额,但对于日期“2007-01-13”,它只返回产品的销售额而不是从“2007-01-06”到“2007-01-13”的总销售额。 任何帮助将不胜感激。

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。样本数据和期望的结果真的很有帮助。言下之意,这个问题听起来像是三个问题,相当宽泛。

标签: tsql sum case case-when


【解决方案1】:

您使用的是什么版本的 SQL? MySQL 4.0 及更高版本具有函数 WEEK(),它将日期拆分为从 0 到 53 的周,表示一年中的周顺序。查看您的代码,以及您正在尝试做的事情,我认为以下内容可能对您有用:

  SELECT WEEK([Date of Sale]) as date,
         [Product ID] as product_id, 
         sum([Sales in GBP]) as sales  
    FROM [blah].[blah-blah]
group by 1,2

这将为您提供 52 或 53 行,用于一年中的每个完整和部分周(除非您在给定的一周内没有销售)。我希望这回答了你的问题?如果不是,我可以提供其他解决方案,但我正在节省自己的写作时间。

【讨论】:

  • 感谢您的评论 这个特殊的任务是希望确定可以从任何一天开始的星期。因此,例如,如果产品 3 在从周三开始的 7 天内销售量最高,则代码会选择该产品,而您的代码会限制我们从周一开始。我正在使用 SQL Server Management Studio,如果您有任何想法,我很想听听。我目前正在尝试构建一个函数,如果 i.) 产品 ID 匹配并且 ii.) 销售是在一周内之前返回 1,否则返回 0。您对如何做到这一点有任何见解吗?
  • 动态日期会给你带来麻烦。我不介意举手说这有点超出我的能力,但这可能会给你至少部分答案:stackoverflow.com/questions/1459851/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-19
  • 1970-01-01
  • 1970-01-01
  • 2017-04-20
  • 2022-01-17
相关资源
最近更新 更多