SQL查询,用于选择计数大于或小于某物的事物

问题描述

我正在尝试编写一个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