【问题标题】:ERROR: Expression using IN has components that are of different data types错误:使用 IN 的表达式具有不同数据类型的组件
【发布时间】:2017-07-18 01:52:48
【问题描述】:

我在 SAS Enterprise Guide 中使用以下查询来查找不同 offer_ids 客户在不同日期的计数:

PROC SQL;               
CREATE TABLE test1 as
select offer_id,
       (Count(DISTINCT (case when date between '2016-11-13' and '2016-12-27' then customer_id else 0 end))) as CUSTID
from test
group by offer_id
;QUIT;

错误:使用 IN 的表达式具有不同数据类型的组件 注意:这里,Offer_id 是字符变量,而 Custome_id 是数字变量。

【问题讨论】:

  • 现有查询中没有IN。如果 Teradata 处理此选择,date 是关键字,今天。

标签: sas teradata proc-sql


【解决方案1】:

您不清楚这是在 SAS 还是 Teradata 上运行(通过直通)。
我猜是 SAS,在这种情况下,您在约会之后会丢失d(例如'2016-11-13'd)。如果没有这个,日期将被视为文本而不是格式化数字。
错误语句有点误导,因为 SAS 将 between 语句视为 in 语句。

【讨论】:

  • OP 的代码是基本 SAS SQL,而不是 Teradata,因为没有 connect to。但好的一点是 OP 可能会歪曲......
  • 感谢您的回答!
【解决方案2】:

这个错误很可能是由比较数字变量DATE 和字符串'2016-11-13' 引起的。如果要在 SAS 中指定日期文字,则必须以 DATE9 格式指定日期,并在右引号后附加字母 D

date BETWEEN '13NOV2016'd AND '27DEC2016'd

请注意,发布的代码中没有引用任何外部数据库。但是即使您的源表是tdlib.tdtable 而不是work.test,您在编写SAS 代码时仍然需要使用SAS 语法。让 Teradata 引擎弄清楚如何为您进行转换。

【讨论】:

  • 完全正确,感谢您指出日期常量的正确格式。我的一个愚蠢的错误是不要把它说出来
  • 感谢您的回答!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-29
相关资源
最近更新 更多