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 查询不起作用 - 聚合和连接的主要内容,如果未能解决你的问题,请参考以下文章
Mongodb聚合$lookup $project和$match不起作用[重复]
Mongodb聚合$lookup $project和$match不起作用[重复]