2013-10-04 84 views
0

第一個問題在這裏!最近開始使用SQLite;沒有太多的編程經驗。SQLite複合WHERE邏輯

我正在從一個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的一個到那裏嘗試,但我無法理解結果。

我的另一個問題是,是否有更好的方法來做到這一點,理想的情況是用戶能夠控制時間範圍(即從三個月變爲一個月)。

請注意,發票每月進行整理,但是產品會在整個月內發佈。 我曾嘗試構建從sales_month,sales_year日期字符串並具有查詢包括的是這樣的:

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

但這似乎並沒有工作。

回答

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