【问题标题】:Display Default Value Decode Oracle SQL显示默认值 解码 Oracle SQL
【发布时间】:2017-04-10 22:43:18
【问题描述】:

如果我的一张表中不存在用户,我会尝试将值设置为零。目前,我正在使用decode来统计满足一定条件的用户数,然后显示结果。

SELECT T.D_CODE, 
       T.C_NO, 
       SUM(DECODE(t.Value, 'A', 1, 0)) AS FirstValue, 
       SUM(DECODE(t.Value, 'B', 1, 0)) AS SecondValue, 
       SUM(DECODE(t.Value, 'C', 1, 0)) AS ThirdValue, 
       SUM(DECODE(t.Value, 'F', 1, 0)) AS LastValue
  FROM Table T, 
       Table OtherTable S
 WHERE T.T_SSN = S.SSN(+) 
   AND T.D_CODE = 'INF'
 GROUP BY t.D_CODE, 
          T.C_NO;

问题是我有一个third table (TT),其中包含其他值。如果TT 的值在Table T 中不存在,那么我需要将所有解码值的记录都显示为 0。

所需的输出类似于:

D_CODE, C_NO, FirstValue, SecondValue, ThirdValue, LastValue INF 600 2 0 0 0 INF 501 0 0 1 0 INF 400 0 0 0 0

其中INF 400不存在于表t中,仅存在于表TT中

有什么建议吗?

【问题讨论】:

  • 样本数据和所需的输出肯定会有所帮助
  • @JorgeCampos 当然,发布了所需的输出
  • 我想我明白了,但我不完全确定,所以我会为您提供答案,如果不是您想要的,请在 cmets 中告诉我。此外,如果不是,您将不得不从满足您所需输出的三个表中添加一些示例数据。

标签: sql oracle oracle11g decode


【解决方案1】:

您的问题是您正在通过T.D_CODE = 'INF' 过滤用户,这意味着任何不符合该条件的用户都不会出现在结果中。所以,根据我对你的问题的理解,你需要这个:

SELECT T.D_CODE, 
       T.C_NO, 
       SUM(CASE WHEN T.D_CODE = 'INF' AND t.Value = 'A' THEN 1 ELSE 0 END) AS FirstValue, 
       SUM(CASE WHEN T.D_CODE = 'INF' AND t.Value = 'B' THEN 1 ELSE 0 END) AS  AS SecondValue, 
       SUM(CASE WHEN T.D_CODE = 'INF' AND t.Value = 'C' THEN 1 ELSE 0 END) AS  AS ThirdValue, 
       SUM(CASE WHEN T.D_CODE = 'INF' AND t.Value = 'D' THEN 1 ELSE 0 END) AS  AS LastValue
  FROM Table T
         LEFT JOIN Table OtherTable S 
           ON T.T_SSN = S.SSN
         LEFT JOIN AnotherTable TT
              ON T.T_SSN = TT.SSN
 GROUP BY t.D_CODE, 
          T.C_NO;

由于您没有提供有关 TT 表的更多详细信息,我只是猜测它与 T 表之间的关系。

旁注:始终使用 SQL ANSI [LEFT]JOINs 样式。

ALSO请注意,对于您当前的查询和当前提取的字段,表 STT 完全不相关,除非您没有正确解释。

【讨论】:

    猜你喜欢
    • 2018-12-11
    • 2013-04-06
    • 1970-01-01
    • 2014-05-13
    • 2017-02-21
    • 2019-04-30
    • 2011-11-12
    • 1970-01-01
    • 2023-04-01
    相关资源
    最近更新 更多