Tableau中CTE查询的初始SQL

问题描述 投票:0回答:1

我正在尝试运行以下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 tableau
1个回答
1
投票

从错误信息中可以看出,你正在运行的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 (这似乎是你嵌套的目的) selects),依靠MySQL对SQL标准的扩展,允许元组在 count(distinct) - 我们也可以表述为 count(distinct date_format(t_start, '%m-%d')) as cnt

  • 我使用了一个子查询,只是因为懒惰,在下面的代码中反复输入相同的聚合函数 case 表达式

  • case 表达式按顺序执行--所以不需要指定条件的上界,因为这些条件已经被前面的分支覆盖了。

  • 你需要使用backtickts来引用标识符,而不是单引号。

© www.soinside.com 2019 - 2024. All rights reserved.