PROC SQL: CASE WHEN EXPRESSION - WHEN 子句 2 的结果与前面的结果的数据类型不同

PROC SQL: CASE WHEN EXPRESSION - Result of WHEN clause 2 is not the same data type as the preceding results

我正在尝试创建并填充一列:'FLAG',使用来自两个表的数据:carteira_base30 和 TRIGGERS_21.

只要 carteira_base30.Data_ref 是 2015 年 12 月 31 日(格式:DATE9。),它应该从 TRIGGERS_21.D31DEC2015(数字格式的列,值为 0 和 1)检索信息。

下面的代码returns我:错误:WHEN 子句 2 的结果与前面的结果的数据类型不同。你能帮帮我吗?

PROC SQL;
CREATE TABLE carteira_base31 AS
    SELECT  x.*,
            CASE x.Data_ref 
            WHEN '31DEC2015'd THEN y.D31DEC2015
            ELSE 'Other'
            END AS 'FLAG'n
    FROM carteira_base30 x
    LEFT JOIN TRIGGERS_21 y
    ON x.NIF = y.NIF;
QUIT;

所有关系表 (1) 都有一个类型的列,即所有行必须在一个列中具有相同类型 (2) 的数据。很抱歉,您不能将数字和文本存储在同一列中,您必须做出决定。

你可以选择字符和代码,例如

CREATE TABLE carteira_base31 AS
    SELECT  x.*,
            CASE x.Data_ref 
                WHEN '31DEC2015'd THEN put(y.D31DEC2015, 1.)
                ELSE 'Other'
            END AS 'FLAG'n
    FROM carteira_base30 x
    LEFT JOIN TRIGGERS_21 y
    ON x.NIF = y.NIF;

或者您可以选择数字和代码,例如

CREATE TABLE carteira_base31 AS
    SELECT  x.*,
            CASE x.Data_ref 
                WHEN '31DEC2015'd THEN y.D31DEC2015
                ELSE .
            END AS 'FLAG'n
    FROM carteira_base30 x
    LEFT JOIN TRIGGERS_21 y
    ON x.NIF = y.NIF;

其中 . 表示“缺失”。

您甚至可以对其应用格式。如果您将文本放入数字字段,那么您的结果将 看起来像 ,尽管您没有这样做。

proc format;
    value miss_other . = 'other';
run;
proc sql;
CREATE TABLE carteira_base31 AS
    SELECT  x.*,
            CASE x.Data_ref 
                WHEN '31DEC2015'd THEN y.D31DEC2015
                ELSE .
            END AS 'FLAG'n format = miss_other.
    FROM carteira_base30 x
    LEFT JOIN TRIGGERS_21 y
    ON x.NIF = y.NIF;

免责声明:不确定我是否正确理解了值语句的语法。

备注:

  1. SAS 数据集是关系表,因为它们包含有关其结构的元数据,您可以将它们与 sql 相关联,尽管它们不在数据库中
  2. 幸运的是,在 SAS 中,您只需在字符和数字之间进行选择。在大多数真实的数据库中,你有十几种数据类型。