如何检索前 4 周的数据 (mySQL)

How to retrieve data from previous 4 weeks (mySQL)

我正在尝试编写查询以获取最近 4 周(周一至周日)的数据。我希望每周的数据都与个人一起存储并共享 table。 每周数据存储基于名称,如果在一周内重复相同的名称,amt 应该求和,如果有多个名称,则应该显示数据个人,为了查看我正在寻找的示例,我在下面包含了所需的输入和输出。

这是我的table

date amt name
2022-04-29 5 a
2022-04-28 10 b
2022-04-25 11 a
2022-04-23 15 b
2022-04-21 20 b
2022-04-16 20 a
2022-04-11 10 a
2022-04-10 5 b
2022-04-05 5 b

我想要这样的输出

date sum(amt) name
2022-04-25 to 2020-04-29 16 a
2022-04-25 to 2020-04-29 10 b
2022-04-18 to 2022-04-24 35 b
2022-04-11 to 2022-04-17 30 a
2022-04-04 to 2022-04-10 10 b

我将不胜感激任何指示或 'best-practises' 我应该用来完成这项任务。

您可以尝试使用 DATE_ADDWEEKDAY 获取周的第一天和结束日期。

SELECT 
    CASE WHEN 
         weekofyear(`date`) = weekofyear(NOW())
    THEN 'current week'
    ELSE 
        CONCAT(date_format(DATE_ADD(`date`, interval - WEEKDAY(`date`) day), '%Y-%m-%d'),' to ',date_format(DATE_ADD(DATE_ADD(`date`, interval  -WEEKDAY(`date`) day), interval 6 day), '%Y-%m-%d'))
    END 'date',
    SUM(amt)
FROM T
GROUP BY 
    CASE WHEN 
          weekofyear(`date`) = weekofyear(NOW())
    THEN 'current week'
    ELSE 
        CONCAT(date_format(DATE_ADD(`date`, interval - WEEKDAY(`date`) day), '%Y-%m-%d'),' to ',date_format(DATE_ADD(DATE_ADD(`date`, interval  -WEEKDAY(`date`) day), interval 6 day), '%Y-%m-%d'))
    END 

sqlfiddle

编辑

我看到你编辑了你的问题,你可以在 group by

中添加 name
SELECT 
    CONCAT(date_format(DATE_ADD(`date`, interval - WEEKDAY(`date`) day), '%Y-%m-%d'),' to ',date_format(DATE_ADD(DATE_ADD(`date`, interval  -WEEKDAY(`date`) day), interval 6 day), '%Y-%m-%d')) 'date',
    SUM(amt),
    name
FROM T
GROUP BY 
  CONCAT(date_format(DATE_ADD(`date`, interval - WEEKDAY(`date`) day), '%Y-%m-%d'),' to ',date_format(DATE_ADD(DATE_ADD(`date`, interval  -WEEKDAY(`date`) day), interval 6 day), '%Y-%m-%d')),
  name
ORDER BY 1 desc

sqlfiddle

这是在 SQL 服务器中,只是乱七八糟。希望能帮到你。

with cteWeekStarts
as
(
    select 
    n,dateadd(week,-n,DATEADD(week, DATEDIFF(week,  -1, getdate()), -1)) as START_DATE
    from
    (values (1),(2),(3),(4)) as t(n)
), cteStartDatesAndEndDates
as
(
    select *,dateadd(day,-1,lead(c.start_date) over (order by c.n desc)) as END_DATE
    from cteWeekStarts as c
) 
,cteSalesSumByDate
as
(
    select s.SalesDate,sum(s.salesvalue) as sum_amt from 
    tblSales as s
    group by s.SalesDate
)
select c3.n as WeekNum,c3.START_DATE,isnull(c3.END_DATE,
dateadd(day,6,c3.start_date)) as END_DATE,
(select sum(c2.sum_amt) from cteSalesSumByDate as c2 where c2.SalesDate 
between c3.START_DATE and c3.END_DATE) as AMT
from cteStartDatesAndEndDates as c3
order by c3.n desc