问题描述
我正在尝试编写一个sqlite查询,以提取在过去12个月内以及该日期之前的产品B 的女性 / strong>是定期购买的(在过去8个月中至少购买了5次),并且在此日期之后,产品B 被停止购买。
这是我写的查询:
SELECT member_id,tran_date FROM Table WHERE
gender = 'Female' and
product_name='Product A' and
tran_date > '15/09/2019' and
((SELECT member_id,tran_date FROM Table WHERE
product_name='Product B' and
tran_date<'15/09/2019' and
tran_date>'15/01/2019') HAVING COUNT(*)>=5) and
((SELECT member_id,tran_date FROM Table WHERE
product_name='Product B' and
tran_date>'15/09/2019') HAVING COUNT(*)==0)
这会出现以下错误:
ERROR: [sqlITE_ERROR] sql error (near "HAVING": Syntax error)
Error Code: 1
3个子部分的3个子查询在没有HAVING COUNT
部分的情况下可以正常工作:
--Look for the females purchasing Product A in the last 12 months
SELECT member_id,tran_date FROM Table WHERE
gender = 'Female' and
product_name='Product A' and
tran_date > '15/09/2019'
--prior to this date,Product B was purchased regularly (at least 5 purchases in the preceding 8 months)
SELECT member_id,tran_date FROM Table WHERE
class_name='Product B' and
tran_date<'15/09/2019' and
tran_date>'15/01/2019'
--post this date,Product B stopped being purchased
SELECT member_id,tran_date FROM Table WHERE
class_name='Product B' and
tran_date>'15/09/2019'
我无法将它们合并。我该怎么办?
作为sql的绝对新手,是否还需要编辑查询才能在Postgre sql上运行?
解决方法
没有分组(HAVING
),就不能使用GROUP BY
,这就是为什么会出错的原因。因为它不知道根据什么来计数记录; ID,日期,名称?首先,您需要确定适合您的计数条件的成员ID,并将其放入主select语句的where子句中。查看下面的代码,查询最后2个查询。这些也可以在PostgreSQL上运行而无需编辑。
如果您的tran_date
列是日期时间,请使用'15/01/2019 00:00:00.000'
之类的格式。如果列是char类型,则请确保所有值都采用相同格式。否则,请更正它们。
SELECT member_id,tran_date
FROM Table
WHERE tran_date BETWEEN '15/01/2019' AND '15/09/2019'
AND member_id IN (SELECT DISTINCT(member_id) AS member_id FROM Table
WHERE tran_date BETWEEN '15/01/2019' AND '15/09/2019'
AND class_name = 'Product B'
GROUP BY member_id
HAVING COUNT(*) > 5)
SELECT member_id,tran_date
FROM Table
WHERE tran_date > '15/01/2019'
AND member_id IN (SELECT DISTINCT(member_id) AS member_id FROM Table
WHERE tran_date > '15/01/2019'
AND class_name = 'Product B'
GROUP BY member_id
HAVING COUNT(*) = 0)
,
您可以group by member_id
并在having
子句中设置所有条件:
select member_id
from tablename
where gender = 'Female' and tran_date > '2019-01-15'
group by member_id
having sum(tran_date > '2019-09-15' and product_name = 'Product A') > 0
and sum(tran_date < '2019-09-15' and product_name = 'Product B') >= 5
and sum(tran_date > '2019-09-15' and product_name = 'Product B') = 0
请注意,SQLite中唯一有效的可比较日期格式是YYYY-MM-DD
。