SQL 查询不起作用 - 聚合和连接

Posted

技术标签:

【中文标题】SQL 查询不起作用 - 聚合和连接【英文标题】:SQL Query Not working - Aggregations and Join 【发布时间】: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列是哪种数据类型? 应该是字符串。余数是整数(日期除外,即日期)。 (谢谢!) 【参考方案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 并且可以简化查询。

以上是关于SQL 查询不起作用 - 聚合和连接的主要内容,如果未能解决你的问题,请参考以下文章

Sql 完全外连接查询在 SQLAlchemy 中不起作用

Mongodb聚合$lookup $project和$match不起作用[重复]

Mongodb聚合$lookup $project和$match不起作用[重复]

当查询字段为objectId时,geoNear聚合是不是不起作用?

具有多个条件的 SQL 查询不起作用

pymongo中带有forEach函数的Mongo聚合查询不起作用