Sql 查询销售,按周分组

Sql 查询销售,按周分组,sql,sqlite,fmdb,Sql,Sqlite,Fmdb,我正试图在SQLLite中为我的应用程序创建一个查询,并希望获得一些帮助 我要编写的查询: “我是一个用户ID为x的用户。对于我的个人工作周,它可以从我想要的任何D天开始(周日到周六,周一到周日等),我想看看哪一个工作周在销售方面是我最差的,哪一个是我最好的 简单来说,“最差”和“最好”只是指该周的最高和最低销售额总和 如果每个人的工作周都从星期天开始,这很容易,但事实并非如此。我必须克服SQL的挑战,将数据库表中的所有行不仅按周分组,而且按自定义周分组(用户定义一周的开始和结束日期) 例如,如

我正试图在SQLLite中为我的应用程序创建一个查询,并希望获得一些帮助

我要编写的查询:

“我是一个用户ID为x的用户。对于我的个人工作周,它可以从我想要的任何D天开始(周日到周六,周一到周日等),我想看看哪一个工作周在销售方面是我最差的,哪一个是我最好的

简单来说,“最差”和“最好”只是指该周的最高和最低销售额总和

如果每个人的工作周都从星期天开始,这很容易,但事实并非如此。我必须克服SQL的挑战,将数据库表中的所有行不仅按周分组,而且按自定义周分组(用户定义一周的开始和结束日期)

例如,如果我的工作周从星期天开始,那么过去的一周,5月28日的一周是星期天,也是我工作周的开始(它在6月3日的星期六结束)。我会按照这个模式处理表中的所有记录

但是,另一个用户的工作周可以从5月29日星期一开始,到6月2日星期五结束

这意味着对于用户1,我希望将他的行从星期天的开始日期到星期六的结束日期进行分组(然后将它们全部汇总,并获取第一个和最后一个销售记录)

但是,对于用户2,我希望将他的记录分组在周一到周日的日期范围内

这就是我目前所处的位置。我想我已经很接近了

(注意,我以毫秒为单位将日期存储为unix时间戳,因此除以1000和unixepoch部分)。+d部分实际上是一个基于一天开始的整数,但我还没有弄清楚该数字到底应该是多少。当我认为我得到它时,它在其他人的一天中失败

SELECT 'Date', SUM(Amount) 'Amount'  
FROM Sales WHERE UserID = x
GROUP BY CAST(( julianday((datetime(CreationDate / 1000, 'unixepoch', 'localtime')) + d) / 7 ) AS INT) 
有人认为他们能帮我吗?:)

非常感谢

编辑

非常感谢你的帮助

对于+d问题(值“d”应该偏移多少)? 这是我在测试后发现的,据我所知,这是有效的。我知道Sqllite使用0作为星期日,1作为星期一,等等,我知道我们分组并除以7(一周中的7天),但你知道为什么这些是作为偏移量的“d”的正确值吗?它现在似乎起作用了。我看到模式是2,1,0,6,5,4,3,但顺序有点奇怪,是吗

if (day == Sunday) //if your work week starts on Sunday, d=2
     return 2
else if (day == Monday)
     return 1
else if (day == Tuesday)
     return 0
else if (day == Wednesday) 
     return 6
else if (day == Thursday) 
     return 5
else if (day == Friday) 
     return 4
else if (day == Saturday) 
     return 3

请尝试执行以下查询:

select 
  min(to_char(to_date(order_date,'mm/dd/yyyy'),'Day'))
    keep(dense_rank first order by sum(sales) desc) best_day,
  min(to_char(to_date(order_date,'mm/dd/yyyy'),'Day'))
    keep(dense_rank last order by sum(sales) desc)worst_day
from orders
where userid=x
group by to_char(to_date(order_date,'mm/dd/yyyy'),'Day');
你很接近

  • 您正在向datetime添加
    d
    。我不知道这是否真的会增加天数。如果在SQLite中向datetime添加整数,我无法发现会发生什么。要保存它,请将日期添加到julian day。您不必首先获取datetime,从这一天开始,您可以通过一个步骤完成:

    julianday(CreationDate / 1000, 'unixepoch', 'localtime') + d
    
    这是我在你的询问中看到的唯一真正的缺陷

  • 儒略日是一个分数,如2457907.5。当你调用一个上面有
    /
    的除法时,你会得到一个分数结果。我看到你将这个结果转换为
    INT
    ,但我建议先转换为INT,然后再进行除法,这将使它隐式地成为一个整数除法

    演员阵容(julianday(CreationDate/1000,'unixepoch','localtime')+d为int)/7

    这只是为了可读性;我得到一个日数(2457907而不是一些小数2457907.5)和整数除以7(例如2457907/7=351129)

  • 整个查询:

    SELECT 
      MIN(DATE(CreationDate / 1000, 'unixepoch', 'localtime')) AS from_date, 
      MAX(DATE(CreationDate / 1000, 'unixepoch', 'localtime')) AS till_date, 
      SUM(Amount) AS total
    FROM Sales 
    WHERE UserID = x
    GROUP BY CAST(JULIANDAY(CreationDate / 1000, 'unixepoch', 'localtime') + d as INT) / 7
    ORDER BY SUM(Amount);
    
    from_date
    till_date
    并不总是表示完整的七天,但仅表示工作日(例如,在一周中,从周日到周六,但只工作周一、周三和周五,它将显示周一和周五的日期)。要显示真实的一周,需要稍微多做一些工作。(我现在最好不要尝试,因为在无法尝试查询的情况下,很容易休息一天。)

    EDIT:这是我对每周开始和结束日期的尝试。当我们对浮点值调用
    DATE
    时,该值被视为儒略日(可能它也适用于整数,我无法从文档中确定)


    哇,谢谢。唯一的一件事是我正在接近“(”:语法错误:所以它没有运行。你的括号似乎与我匹配。我在列的命名后加上空格,甚至在引号中加上你的“最糟糕的一天”和“最好的一天”,但它仍然抛出语法错误。你知道在列附近会发生什么错误吗(?是否可能“keep”不是有效的SQLLITE语句?这是一个Oracle查询。它在SQLite中不起作用。而且在Oracle中也不起作用,因为这里的凿槽是在几天而不是几周。我可以知道为什么它在Oracle中不起作用,因为它每天都在oracleYou组中运行。这怎么可能导致每周的总和?(除此之外,是什么让您认为日期存储为字符串格式的“mm/dd/yyyy”?)感谢您抽出时间来查看此内容!在我运行此功能的开发人员数据库中,某个特定用户的一天从28日星期日开始,到2日星期六结束(今天).他那周只工作了3天。当我运行上面的查询时,它似乎按照您所说的那样做,并考虑了几天的工作,而不是整个星期。我玩了+d部分(+0,+1,…,+7)当然,它显示了不同的结果,但没有正确聚合。我会继续玩这个,但感谢您的支持!如果您有任何其他建议,也不介意,我很想从您那里得到更多帮助。谢谢您,先生!这应该是正确的。整个星期都在这个查询中考虑(只有真实的一周的开始和结束没有显示;你必须以某种方式从你的小组中通过公式计算出来)。你可以编辑你的问题并显示结果(大约五行)您认为一个或多个结果行不正确的地方。我添加了一个查询,希望能够正确地说明周的开始和结束。我更新了ORDER BY子句,因此您可以先看到最差的一周,然后再看到最好的一周
    SELECT 
      DATE(CAST(CAST(JULIANDAY(CreationDate / 1000, 'unixepoch', 'localtime') + d as INT) / 7 as REAL)) AS from_date,
      DATE(CAST(CAST(JULIANDAY(CreationDate / 1000, 'unixepoch', 'localtime') + d as INT) / 7 as REAL), '+6 day') AS till_date,
      MIN(DATE(CreationDate / 1000, 'unixepoch', 'localtime')) AS first_working_day, 
      MAX(DATE(CreationDate / 1000, 'unixepoch', 'localtime')) AS last_working_day, 
      SUM(Amount) AS total
    FROM Sales 
    WHERE UserID = x
    GROUP BY CAST(JULIANDAY(CreationDate / 1000, 'unixepoch', 'localtime') + d as INT) / 7
    ORDER BY SUM(Amount);