【问题标题】:Initial SQL for CTE query in TableauTableau 中 CTE 查询的初始 SQL
【发布时间】:2020-09-23 23:58:57
【问题描述】:

我正在尝试运行以下 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 对应的手册 服务器版本,以便在 'Tap AS (SELECT DISTINCT account_id, MONTH(t_start) AS month, DAY(t_start) AS' at line 1 初始 SQL 错误。检查语法是否正确,并且您 有权访问所请求的数据库。

我不明白为什么 - 它在 SSMS 中运行良好,在我读过的各种论坛上,CTE 查询应该在 Tableau 的初始 SQL 部分中运行。

任何帮助表示赞赏!

【问题讨论】:

  • 如果上面的链接没有回答您的问题,请说明您是如何在 Tableau 中运行该 cte 的,以及您在什么时候收到错误。另外,什么版本的 Tableau?
  • 您的错误显示“mysqld-5.7.25-google-log”...此代码仅适用于 MySQL 8,不适用于较低版本
  • 你做事很辛苦。尝试仅将 Tableau 指向原始表 Knowledge_repeat,而不是使用自定义 SQL。如果您详细了解 Tableau 的工作原理,您可以让它根据您想要的视图为您生成优化的 SQL。您将完成更多、更快、更灵活。很少需要自定义 SQL。否则,您将放弃 Tableau 带来的主要优势之一,而仅将其用作绘图工具。有一个学习曲线,一开始很难相信它会生成 SQL,但你的 SQL 概念知识仍然值得。非常值得花时间学习。
  • @AlexBlakemore 您是否建议我只要将 Tableau 中的计算字段指向原始表格,就应该能够做到这一点?

标签: mysql sql count tableau-api common-table-expression


【解决方案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 的目的),依赖于 SQL 标准的 MySQL 扩展,它允许 count(distinct) 中的元组 -我们也可以将其表述为count(distinct date_format(t_start, '%m-%d')) as cnt

  • 出于懒惰,我使用子查询在case 表达式中一次又一次地键入相同的聚合函数,但这里并不一定需要

  • case 表达式按顺序执行 - 因此无需指定条件的上限,因为它们已被前面的分支覆盖

  • 您需要使用反引号来引用标识符而不是单引号

【讨论】:

    猜你喜欢
    • 2020-05-14
    • 2012-09-10
    • 2017-01-15
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    相关资源
    最近更新 更多