SQLite复合WHERE逻辑

时间:2013-10-04 12:32:31

标签: date sqlite

这里的第一个问题!最近开始使用SQLite;没有多少先前的编程经验。

我正在研究一种从sqlite数据库在Excel中生成报告的工具。

我目前正在处理的报告取决于查找在特定时间段内发布的产品每月的平均收入。

例如,2011年9月的数据将是9月,8月和7月发布的所有产品当月产生的所有收入的平均值。

查询如下所示:

SELECT date,avg(total_revenue) from product_table join revenue_table

WHERE(

(
sales_month=strftime('%m',release_date,'+1 months') AND
sales_year=strftime('%Y',release_date,'+1 months')
)

OR

(
sales_month=strftime('%m',release_date,'+2 months') AND
sales_year=strftime('%Y',release_date,'+2 months')
)

OR

(
sales_month=strftime('%m',release_date,'+3 months') AND
sales_year=strftime('%Y',release_date,'+3 months')
)

OR

(
sales_month=strftime('%m',release_date) AND
sales_year=strftime('%Y',release_date)
)

AND
additional_filters=true
)

group by sales_year, sales_month;

我认为这会产生我想要的数据,但即使这样,它也是可怕的,笨拙的和不可扩展的。

我的第一个问题是这种嵌套逻辑是否在sqlite WHERE语句中有效 即,您可以构建一个类似的查询:

where ((a=b AND c=d) OR (a=d AND b=c))

我已尝试将其中一个OR更改为where,但我无法理解结果。

我的另一个问题是,是否有更优雅的方式来做到这一点,理想情况下,用户将能够控制时间范围(即从三个月改为一个月)。

请注意,发票每月整理一次,但产品会在整个月内发布。 我尝试从sales_month,sales_year构建一个日期字符串,并且查询包含如下内容:

where (julianday(sales_date)-julianday(release_date) BETWEEN 0 AND 90 AND addtional_filters)

但这似乎不起作用。

1 个答案:

答案 0 :(得分:0)

WHERE子句中的表达式可以是任意复杂的。

您的销售/发布比较可以使用以下表达式完成:

WHERE date(sales_date, 'start of month')
      BETWEEN date(release_date, 'start of month')
          AND date(release_date, 'start of month', '+2 months')
  AND ...