【问题标题】:Get SUM of Current Week data and Current Year data from SQLite从 SQLite 获取当前周数据和当前年份数据的总和
【发布时间】:2020-12-17 01:55:15
【问题描述】:

我有一个 SQLite 数据库,sales 表如下,

| 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)

那么任何人都可以帮助我实现这一目标吗?提前致谢。

【问题讨论】:

    标签: sql sqlite common-table-expression


    【解决方案1】:

    你可以试试下面的 - 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
    

    【讨论】:

    • 感谢您的回答,但它总是给我数量为 0。我必须使用UNION ALL SELECT
    • @AbrahamArnold,您现在可以查看。如果它为您提供每周数据,那么您需要每月遵循类似的数据,然后您可以合并两个结果集
    • 对不起,它仍然给我 0。什么是 d ?我不应该通过今天的日期来获得当前的星期吗?
    • @AbrahamArnold,您能否在此处创建您的示例表 - dbfiddle.uk
    • 是的,我创建了一个。这是link
    【解决方案2】:

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

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

    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);
    

    【讨论】:

    • 感谢您的回答。但它给了我错误。我正在使用 SQLite,请检查表 structure
    • 知道了。不支持选项和最大递归,您必须寻找其他选项来在 sqlite 中创建每周日历
    【解决方案3】:

    对于当前周的总计,您需要一个返回日期名称的 CTE 和另一个返回本周星期一的 CTE。
    您必须交叉连接这些 CTE 并左连接您的表以进行聚合:

    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,它返回月份名称,然后左连接表进行聚合:

    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
    

    【讨论】:

    • 非常感谢您的出色回答。它就像一个魅力。 ?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多