我正在尝试运行以下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_id, MONTH(t_start) AS month, DAY(t_start) AS'附近查看正确的语法。检查语法是否正确,你是否有访问数据库的权限。
我不明白为什么 - 它在SSMS中工作得很好,在各种论坛上我读到CTE查询应该在Tableau的初始SQL部分工作。
感谢任何帮助
从错误信息中可以看出,你正在运行的MySQL 5.7不支持 WITH
子句(也就是常见的表格表达式)。这个功能只在8.0版本中加入。
对于您的查询,您可以 可以 简单地把CTE变成一个子查询。但我还是怀疑你的代码在很大程度上可以简化(当然,假设目前在一些非MySQL的数据库上产生你想要的结果)。
下面是一个尝试。
select
account_id,
cnt `Unique`,
case
when cnt > 10 then `Super Loyal`
when cnt > 5 then `Semi Loyal`
when cnt > 2 then `Tried It`
when cnt = 1 then `Tried it once`
else `Crazy Keen`
end as `Loyalty Rating`
from (
select
account_id,
count(distinct month(t_start), month(t_day)) as cnt
from knowledge_repeat
group by account_id
) t
理由是:
这样做是为了计算每个月日的不同元组 account_id
(这似乎是你嵌套的目的) select
s),依靠MySQL对SQL标准的扩展,允许元组在 count(distinct)
- 我们也可以表述为 count(distinct date_format(t_start, '%m-%d')) as cnt
我使用了一个子查询,只是因为懒惰,在下面的代码中反复输入相同的聚合函数 case
表达式
的 case
表达式按顺序执行--所以不需要指定条件的上界,因为这些条件已经被前面的分支覆盖了。
你需要使用backtickts来引用标识符,而不是单引号。