【问题标题】:How to take SAS query for SUM(Case) and make them work in Teradata SQL如何对 SUM(Case) 进行 SAS 查询并使其在 Teradata SQL 中工作
【发布时间】:2020-08-30 08:39:16
【问题描述】:

我正在尝试运行在 SAS 中构建的查询,但没有让 case 语句在 Teradata SQL 中工作

原始 SAS 代码

CREATE TABLE WORK.RSL_Validation AS 
SELECT 
t.eventDt, 
t.repID,
t.validation1,
t.validation2,
t.validation3,

(SUM((
CASE
WHEN t.validation1 is missing
THEN 0 
ELSE 1
END), 
(CASE
WHEN t.validation2 is missing 
THEN 0
ELSE 1 
END), 
(CASE
WHEN t.validation3 is missing 
THEN 0 
ELSE 1
END))) AS Val_Count
FROM RSL t;

validation1、validtion2 和 validation3 的值显示为“?”在我制作的表格中,但我想它们将是空的。

我正在尝试的 SQL 代码是:

CREATE TABLE WORK.RSL_Validation AS 
SELECT 
t.eventDt, 
t.repID,
t.validation1,
t.validation2,
t.validation3,

SUM((
CASE
WHEN t.validation1 is null
THEN 0 
ELSE 1
END), 
(CASE
WHEN t.validation2 is null
THEN 0
ELSE 1 
END), 
(CASE
WHEN t.validation3 is null 
THEN 0 
ELSE 1
END))) AS Val_Count
FROM RSL t;)
WITH DATA ON COMMIT PRESERVE ROWS;

似乎没有任何效果

【问题讨论】:

  • 您是否尝试在每一行上独立地对三个值求和?或者在所有行中生成一个聚合?我不认为 Teradata 有 SUM(a,b,c) 函数。尝试仅使用加法,a+b+c。如果您尝试聚合,则 Teradata 不会像 PROC SQL 那样重新合并聚合值。选择的每个变量都需要是 GROUP BY 的一部分或聚合函数。

标签: sas teradata teradata-sql-assistant


【解决方案1】:

您需要使用聚合子选择来交叉连接原始表。如果您想要超过 DATE 的计数,您需要 INNER JOIN 到分组聚合子选择。根据@Tom,一个简单的加号 (+) 运算符可用于将各个列聚合添加在一起。

例子:

假设每个日期组有 10 行。所以每个日期都有 30 个潜在的验证。

data have;
  call streaminit(123);
  do date = today()-10 to today();
    do repid = 1 to 10;
      array val val1-val3;
      do over val;
        val = ifn(rand('uniform') < 0.20, ., rand('integer',1,10));
      end;
      output;
    end;
  end;
  format date yymmdd10.;
run;

proc sql;
  create table want as
  select
    have.date
  , repid
  , val1
  , val2
  , val3
  , val1_val3_DATE_N
  , val1_val3_ALL_N
  from
    have
  cross join
    /* AGGREGATE OVER ALL ROWS SUBSELECT */
    (select 
        sum (case when val1 is missing then 0 else 1 end) 
      + sum (case when val2 is missing then 0 else 1 end) 
      + sum (case when val3 is missing then 0 else 1 end) 
      AS 
        val1_val3_ALL_N
     from have
    ) as COMPUTE_ALL_N
  join
    /* DATE GROUPED AGGREGATE SUBSELECT */
    (select
      date
      ,
        sum (case when val1 is missing then 0 else 1 end) 
      + sum (case when val2 is missing then 0 else 1 end) 
      + sum (case when val3 is missing then 0 else 1 end) 
      AS 
        val1_val3_DATE_N
     from have
     group by date
    ) as COMPUTE_DATE_N
  on
    have.date = compute_date_n.date   /* INNER JOIN CRITERIA */
;

【讨论】:

    猜你喜欢
    • 2014-12-26
    • 2013-07-08
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    • 1970-01-01
    • 2016-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多