从 SQLite 获取当周数据和当年数据的 SUM

Get SUM of Current Week data and Current Year data from SQLite

我有一个 SQLite 数据库,sales table 如下所示,

| Id | quantity |     dateTime     |
------------------------------------
| 1  | 10       | 2019-12-25 12:55 |
| 2  | 05       | 2019-12-30 12:55 |
| 3  | 25       | 2020-08-23 12:55 |
| 4  | 25       | 2020-08-24 12:55 |
| 5  | 56       | 2020-08-25 12:55 |
| 6  | 25       | 2020-08-26 12:55 |
| 7  | 12       | 2020-08-27 12:55 |
| 8  | 30       | 2020-08-28 12:55 |
| 9  | 40       | 2020-08-29 12:55 |

我需要获取当周数据(周一到周日)和当年数据(一月到十二月)。因此,如果我通过今天的日期,我只需要按如下日期分组获取当前周的销售数据,

如果我传递今天的日期和时间 (2020-08-28 13:55),查询应该给我这样的当前周数据,

Day        Sold Items (SUM(quantity))
Monday     20
Tuesday    25
Wednesday  10
Thursday   50
Friday     60
Saturday   0 (If the date hasn't come yet I need to get 0)
Sunday     0

当我传递当前日期时,与当前年份数据相同,

Month      Sold Items (SUM(quantity))
JAN        20
FEB        25
MAR        10
APR        50
MAY        60
JUN        0 (If the month hasn't come yet I need to get 0)
JUL        0
...        ...

我在 SQLite 中尝试了多个查询,但无法获得我需要的结果。这是我试过的查询,

Weekly Data (This one gave me past week data also)
SELECT SUM(quantity) as  quantity, strftime('%w', dateTime) as Day
From sales
Group by strftime('%w', dateTime)

Monthly Data
SELECT SUM(quantity) as  quantity, strftime('%m', dateTime) as Month
From sales
Group by strftime('%m', dateTime)

所以有人可以帮我实现这个目标吗?提前致谢。

您可以尝试以下 - DEMO

select day,coalesce(sum(quantity),0) as quantity
from 
(select 0 as day union all select 1 union all select 2 union all select 3 union all select 4
union all select 5 union all select 6) as d
left join sales on cast(strftime('%w', dateTime) as int)=day 
group by strftime('%w', dateTime),day
order by day

您可以使用下面的查询来获取每周日期,我假设每个日期都有一个条目,因此不会分组,否则您可以添加分组依据。

首先我们会根据输入的日期得到周历(我取的是当前日期) 然后离开加入日历以获取所需的已售商品信息。

WITH seq(n) AS 
(
  SELECT 0 UNION ALL SELECT n + 1 FROM seq
  WHERE n < DATEDIFF(DAY, (SELECT DATEADD(DAY, 2 - DATEPART(WEEKDAY, GETDATE()), CAST(GETDATE() AS DATE)) [Week_Start_Date]), (Select DATEADD(DAY, 8 - DATEPART(WEEKDAY, GETDATE()), CAST(GETDATE() AS DATE)) [Week_End_Date]))
),
CALENDAR(d) AS 
(
  SELECT DATEADD(DAY, n, (SELECT DATEADD(DAY, 2 - DATEPART(WEEKDAY, GETDATE()), CAST(GETDATE() AS DATE)) [Week_Start_Date])) FROM seq
)
SELECT coalesce(QUANTITY, 0) sold_items ,DATENAME(WEEKDAY, d) week_day FROM CALENDAR a left outer join Table_WEEKDAY b
on (a.d = convert(date, b.dateTime))
ORDER BY d
OPTION (MAXRECURSION 0);

对于本周的总计,您需要一个 returns 日期名称的 CTE 和另一个 returns 本周星期一的 CTE。
您必须交叉加入这些 CTE 并离开加入您的 table 以聚合:

with 
  days as (
    select 1 nr, 'Monday' day union all
    select 2, 'Tuesday' union all
    select 3, 'Wednesday' union all
    select 4, 'Thursday' union all
    select 5, 'Friday' union all
    select 6, 'Saturday' union all
    select 7, 'Sunday'
  ),
  weekMonday as (
    select date(
        'now', 
        case when strftime('%w', 'now') <> '1' then '-7 day' else '0 day' end, 
        'weekday 1'
      ) monday
  )
select d.day, 
       coalesce(sum(t.quantity), 0) [Sold Items]
from days d cross join weekMonday wm
left join tablename t
on strftime('%w', t.dateTime) + 0 = d.nr % 7
and date(t.dateTime) between wm.monday and date(wm.monday, '6 day')
group by d.nr, d.day
order by d.nr

对于当年的总计,您需要一个 CTE,其中 returns 月份命名,然后左加入 table 进行汇总:

with 
  months as (
    select 1 nr, 'JAN' month union all
    select 2 nr, 'FEB' union all
    select 3 nr, 'MAR' union all
    select 4 nr, 'APR' union all
    select 5 nr, 'MAY' union all
    select 6 nr, 'JUN' union all
    select 7 nr, 'JUL' union all
    select 8 nr, 'AUG' union all
    select 9 nr, 'SEP' union all
    select 10 nr, 'OCT' union all
    select 11 nr, 'NOV' union all
    select 12 nr, 'DEC'
  )
select m.month, 
       coalesce(sum(t.quantity), 0) [Sold Items]
from months m
left join tablename t
on strftime('%m', t.dateTime) + 0 = m.nr
and date(t.dateTime) between date('now','start of year') and date('now','start of year', '1 year', '-1 day')
group by m.nr, m.month
order by m.nr