【问题标题】:Missing row when data value is 0 in teradatateradata 中数据值为 0 时缺少行
【发布时间】:2020-09-03 16:55:42
【问题描述】:

我试图在查询中进行分组,但每次数据有 0 时,分组不会显示整行。我该如何解决这个问题?

这是常规查询

select 
    COUNT(DISTINCT sr.sr_number) AS NEW_CASES
FROM table sr
where 
    sr.business_unit in('BU1')
    and OPENED_DATE < trunc(current_Date)
    and OPENED_DATE > trunc(current_date -2)
    and sr.status = 'Open'

输出是

NEW_CASES
0

但是当我做一个分组时。整行都不见了。

select 
    COUNT(DISTINCT sr.sr_number) AS NEW_CASES,
    sr.business_unit
FROM table sr
where 
    sr.business_unit in('BU1','BU2','BU3' )
    and OPENED_DATE < trunc(current_Date)
    and OPENED_DATE > trunc(current_date -2)
    and sr.status = 'Open'
group by sr.business_unit

按输出分组是

New_CASES    BUSINESS_UNIT
      200    BU2
      300    BU3

期望的输出:

New_CASES    BUSINESS_UNIT
        0    BU1
      200    BU2
      300    BU3

【问题讨论】:

  • 您使用的是 Oracle 还是 Teradata?请正确标记。
  • 数据库是 teradata 但通过 Oracle SQL 开发人员

标签: sql group-by count teradata


【解决方案1】:

一种选择是从一个固定的值列表开始,然后将表带上left join,如下所示:

select b.business_unit, count(distinct t.sr_number) as new_cases
from (
    select 'bu1' business_unit from dual
    union all select 'bu2' from dual
    union all select 'bu3' from dual
) b
left join mytable t
    on  t.business_unit = b.business_unit
    and t.opened_date > trunc(current_date -2)
    and t.opened_date < trunc(current_date)
    and t.status = 'open'
group by b.business_unit

在 Teradata 中,语法有点麻烦:

select b.business_unit, count(distinct t.sr_number) as new_cases
from (
    select * from (select 'bu1' as business_unit) x
    union all select * from (select 'bu2' as business_unit ) x
    union all select * from (select 'bu3' as business_unit ) x
) b
left join mytable t
    on  t.business_unit = b.business_unit
    and t.opened_date > trunc(current_date -2)
    and t.opened_date < trunc(current_date)
    and t.status = 'open'
group by b.business_unit

【讨论】:

  • [teradata Database] [TeraJDBC 16.20.00.13] [Error 3707] [SQLState 42000] 语法错误,应为名称或 Unicode 分隔标识符或“UDFCALLNAME”关键字或“(”之间的'from' 关键字和 'dual' 关键字。
  • @RLearner:这是 Oracle 语法。如果您的工作是否删除了所有出现的from dual?
  • 让我尝试用实际的表格替换它。我认为 dual 是 oracle db 中的默认表对吗?
  • OK 那没用。我确实让 BU1 与另外两个 BU 一起显示为 0,但其他 2 个的数据是错误的,另外一个名称较大的 BU 被截断(名称中缺少字符)
  • @RLearner:我做了一些研究,并用应该在 Teradata 中工作的查询更新了我的答案。
【解决方案2】:

使用left join。在 Oracle 中,这看起来像

select b.business_unit, COUNT(DISTINCT sr.sr_number) AS NEW_CASES
from (select 'BU1' as business_unit from dual union all
      select 'BU2' as business_unit from dual union all
      select 'BU3' as business_unit from dual 
     ) b left join
     sr
     on sr.business_unit = b.business_unit and
        sr.OPENED_DATE < trunc(current_Date) and
        sr.OPENED_DATE > trunc(current_date -2) and
        sr.status = 'Open'
group by b.business_unit

编辑:

Teradata 没有一种非常方便的方法来创建常量值的派生表,但您可以做到:

select b.business_unit, COUNT(DISTINCT sr.sr_number) AS NEW_CASES
from (select 'BU1' as business_unit from (select 1 as dummy) t union all
      select 'BU2' as business_unit from (select 1 as dummy) t  union all
      select 'BU3' as business_unit from (select 1 as dummy) t  
     ) b left join
     sr
     on sr.business_unit = b.business_unit and
        sr.OPENED_DATE < trunc(current_Date) and
        sr.OPENED_DATE > trunc(current_date -2) and
        sr.status = 'Open'
group by b.business_unit

【讨论】:

  • 当我尝试这样做时出现此错误:[teradata Database] [TeraJDBC 16.20.00.13] [Error 3707] [SQLState 42000] 语法错误,应为名称或 Unicode 分隔标识符或 ' UDFCALLNAME' 关键字或 '(' 在 'from' 关键字和 'dual' 关键字之间。
  • 感谢您的回复。我尝试了您的 teradata 解决方案,但它似乎不起作用。我只得到 3 行(预计 4 行)。但是我得到的三个并没有显示完整的数据。而应该显示 0 的业务部门现在显示为零。其余的现在一团糟。企业名称被截断,其对应值错误。 (当我在没有分组的情况下运行它们时是正确的)
  • 您应该期待三行,就像您的问题所要求的那样。
  • 在 Teradata 中,UNION [ALL] 中的第一个子查询确定了结果的数据类型,另外在 Teradata 事务模式中,字符串截断是静默发生的。如果您包含常量或不同的值,建议将它们显式转换为适当的结果类型(和长度)。如果您使用 ANSI 事务模式,则字符串截断将被标记为错误 - 尽管默认情况下字符文字会区分大小写。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多