2017-04-10 103 views
0

我试图将值设置为零,如果用户不存在于我的一个表中。目前,我正在使用解码来计算符合特定条件的用户数量,然后显示结果。显示默认值解码Oracle SQL

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中,那么我需要为所有Decode值显示该记录,其值为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

有什么建议?

+0

示例数据和必需的输出肯定会有所帮助 –

+0

@JorgeCampos肯定,发布要求的输出 – rvisio

+0

我想我明白了,但我不完全确定,所以我会给你一个答案,如果它不是你想要的你在评论中告诉我。另外,如果不是,你将不得不从三个表中添加一些符合你想要的输出的样本数据。 –

回答

0

您的问题是您正在筛选用户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] JOIN样式。

ALSO请注意,您目前的查询和取现字段的表STT是完全不相干的,除非你没有解释是正确的。