选择按周分组的SQL结果

Zai*_*Ali 29 t-sql sql-server sql-server-2005

我希望按周选择下表中的数据

 Date       Product Name   Sale
+----------+--------------+-----+
 14-05-11     a             2
 14-05-11     b             4 
 17-05-11     c             3
 19-05-11     a             6
 24-05-11     a             6
 29-05-11     a             6    
Run Code Online (Sandbox Code Playgroud)

让我们假设今天是 30-05-11

所以我的结果应该是这样的.

 Product Name         First Week   Second Week  Third Week
+--------------------+------------+------------+-------------+
   a                      12            6           2
   b                       0            0           4 
   c                       0            3           0  
Run Code Online (Sandbox Code Playgroud)

请问有些人指导我如何编写SQL查询来实现这种行为!

Ste*_*ieG 40

我认为应该这样做..

Select 
ProductName,
WeekNumber,
sum(sale)
from
(
    SELECT 
    ProductName,
    DATEDIFF(week, '2011-05-30', date) AS WeekNumber,
    sale
    FROM table
)
GROUP BY
ProductName,
WeekNumber
Run Code Online (Sandbox Code Playgroud)

  • 这对我不起作用,我在 GROUP BY 也遇到语法错误。我摆脱了子查询并将 DATEDIFF 替换为 DATEPART(wk,date) 并按相同的分组。这更简单并且工作正常。然而,我赞成这个答案,因为它为我指明了正确的方向。 (5认同)
  • Downvote?4年后?downvoter会关注评论吗? (4认同)
  • 我想将周显示为列,s(第一周第二周等等) (3认同)
  • 这对我也不起作用,直到我将子条款命名为右括号之后的内容。 (2认同)

inc*_*lly 17

提供的解决方案似乎有点复杂?这可能有帮助:

https://msdn.microsoft.com/en-us/library/ms174420.aspx

select
   mystuff,
   DATEPART ( year, MyDateColumn ) as yearnr,
   DATEPART ( week, MyDateColumn ) as weeknr
from mytable
group by ...etc
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的答案,应该是被接受的答案。 (2认同)

cod*_*ger 13

这应该为你做:

Declare @DatePeriod datetime

Set @DatePeriod = '2011-05-30'

Select  ProductName,
        IsNull([1],0) as 'Week 1',
        IsNull([2],0) as 'Week 2',
        IsNull([3],0) as 'Week 3',
        IsNull([4],0) as 'Week 4',
        IsNull([5], 0) as 'Week 5'

From 
(
Select  ProductName,
        DATEDIFF(week, DATEADD(MONTH, DATEDIFF(MONTH, 0, InputDate), 0), InputDate) +1 as [Weeks],
        Sale as 'Sale'

From dbo.YourTable
-- Only get rows where the date is the same as the DatePeriod
-- i.e DatePeriod is 30th May 2011 then only the weeks of May will be calculated
Where DatePart(Month, InputDate)= DatePart(Month, @DatePeriod)
)p 
Pivot (Sum(Sale) for Weeks in ([1],[2],[3],[4],[5])) as pv
Run Code Online (Sandbox Code Playgroud)

它将计算相对于月份的周数.因此,而不是一年中的第20周,它将是第2周.该@DatePeriod变量仅用于获取相对于月份的行(在此示例中仅针对5月)

使用我的样本数据输出:

在此输入图像描述

  • 在 where 条件中添加 DatePart(YEAR, InputDate)= DatePart(YEAR, @DatePeriod) 否则,如果表有 4 年的数据,那么“MAY”月份的所有数据将相加。 (2认同)
  • 还请添加第 6 周。一个月最多可以有 6 周,例如 2017 年 4 月 (2认同)