【问题标题】:SQL Query Not working - Aggregations and JoinSQL 查询不起作用 - 聚合和连接
【发布时间】:2019-08-05 13:41:08
【问题描述】:

我目前正在 AWS 中运行以下 SQL 查询(Redshift,通过 SQL Workbench 访问)并收到此错误:

数字类型的输入语法无效。代码:8001

我做错了什么?非常感谢您提供的任何帮助!

查询失败:

SELECT  
    b.description,
    a.date,
    SUM(a.time1_sec),
    SUM(a.time2_sec),
    SUM(a.time3_sec),
    SUM(a.time4_sec),
    SUM(a.time5_sec),
    COUNT(DISTINCT(a.id))
FROM 
    a 
JOIN 
    b ON a.id = b.id
WHERE 
    a.date >= '2014-01-01'
    AND b.date <= '2019-07-31'
GROUP BY 
    a.date, b.description

两个有效的查询:

SELECT 
    a.date,
    SUM(a.time1_sec),
    SUM(a.time2_sec),
    SUM(a.time3_sec),
    SUM(a.time4_sec),
    SUM(a.time5_sec),
    COUNT(DISTINCT(a.id))
FROM
    a 
JOIN 
    b ON a.id = b.id
WHERE 
    a.date >= '2014-01-01'
    AND b.date <= '2019-07-31'
GROUP BY 
    a.date

这也有效:

SELECT 
    b.description, a.date,
FROM 
    a 
JOIN 
    b ON a.id = b.id
WHERE 
    a.date >= '2014-01-01'
    AND b.date <= '2019-07-31'

【问题讨论】:

  • 请用您正在使用的数据库引擎标记您的问题。 sql 是一种语言,而不是数据库产品。你的意思是sql-server
  • 哦,当然!我很抱歉。我正在使用 AWS。
  • AWS 中有什么数据库引擎?
  • b.description列是哪种数据类型?
  • 应该是字符串。余数是整数(日期除外,即日期)。 (谢谢!)

标签: sql amazon-redshift


【解决方案1】:

没有样本数据很难猜出问题出在哪里,因为查询看起来很好。我的建议是从一个基本的工作查询开始,然后开始添加内容,直到找到导致错误的原因。当您发现它时,它会编辑您的问题并向我们提供更多信息。

开始于:

SELECT  
    a.date,
    b.description,
    COUNT(*)
FROM 
    a 
JOIN 
    b ON a.id = b.id
GROUP BY 
    a.date, b.description

然后将WHERE条件一一添加,再将SUM一一添加,以此类推

【讨论】:

    【解决方案2】:

    让它工作!看起来问题是 Redshift 中的一个错误,它可以使整数加载为 varchars(当它们应该是整数时)。这个博客有更多关于它的信息: https://blog.getdbt.com/how-to-safely-convert-strings-to-integers-in-redshift/

    老实说,现在不确定为什么早期的一些查询有效,但生活是神秘的……

    我通过将其更改为以下方式解决了我的查询:

    SELECT b.description as description, a. date as date,
    
    SUM(CASE WHEN a.int1 ~ '^[0-9]+$' THEN a.int1 ELSE null end::int) as int1,
    
    SUM(CASE WHEN a.int2 ~ '^[0-9]+$' THEN a.int2 ELSE null end::int) as int2,
    
    SUM(CASE WHEN a.int3 ~ '^[0-9]+$' THEN a.int3 ELSE null end::int) as int3,
    
    SUM(CASE WHEN a.int4 ~ '^[0-9]+$' THEN a.int4 ELSE null end::int) as int4,
    
    SUM(CASE WHEN a.int5 ~ '^[0-9]+$' THEN a.int5 ELSE null end::int) as int5
    
    FROM a JOIN b
    
    ON a.id = b.id
    
    WHERE a.date >= '2014-01-01'
    
    AND b.date <= '2019-07-31'
    
    GROUP BY b.description, a. date
    

    【讨论】:

    • 很高兴你解决了它,但你不应该使用 var char 来保存secs。 fyi ELSE NULL 是默认值,因此无需包含 ELSE 并且可以简化查询。
    猜你喜欢
    • 2023-02-03
    • 2011-12-15
    • 2023-03-06
    • 2021-07-03
    • 1970-01-01
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    • 2018-07-11
    相关资源
    最近更新 更多