我正在尝试运行以下sql查询
WITH Tap AS (SELECT DISTINCT
account_id,
MONTH(t_start) AS month,
DAY(t_start) AS day
FROM knowledge_repeat)
SELECT DISTINCT
account_id,
COUNT(account_id) as 'Unique',
CASE
WHEN COUNT(account_id) > 10 THEN 'Super Loyal'
WHEN COUNT(account_id) > 5 AND COUNT(account_id) < 10 THEN 'Semi Loyal'
WHEN COUNT(account_id) > 2 AND COUNT(account_id) < 5 THEN 'Tried It'
WHEN COUNT(account_id) = 1 THEN 'Tried it once'
ELSE 'Crazy Keen'
END AS 'Loyalty Rating'
FROM Tap
GROUP BY account_id
但是得到以下错误
[mysql][odbc 8.0(w)driver][mysqld-5.7.25-google-log]您的sql语法有错误;请查看与您的mysql服务器版本对应的手册,以了解在第1行初始sql错误处使用“tap as(select distinct account\u id,month(t\u start)as month,day(t\u start)as”附近的正确语法。检查语法是否正确,以及您是否具有对请求的数据库的访问权限。
我不明白为什么-它在ssms中运行良好,在我读过的各种论坛上,cte查询应该在tableau的初始sql部分工作。
感谢您的帮助!
1条答案
按热度按时间k3fezbri1#
从错误消息中可以看出,您正在运行的MySQL5.7不支持
WITH
子句(又称公共表表达式)。此功能仅在版本8.0中添加。对于您的查询,您可以简单地将cte转换为子查询。但是我仍然怀疑您的代码可以大大简化(当然,假设它当前在一些非mysql datatabase上生成您想要的结果)。
下面是一个镜头:
理论基础:
这将统计每个月/天的不同元组
account_id
(这似乎是你的目的。)select
s) ,依赖于sql标准的mysql扩展,该扩展允许在count(distinct)
-我们也可以这样说count(distinct date_format(t_start, '%m-%d')) as cnt
我使用一个子查询just ouf of laziness在case
表达,但这里并不严格需要这个
case
表达式按顺序执行-因此不需要为条件指定上界,因为它们已被前面的分支覆盖您需要使用反引号来引用标识符,而不是单引号