【问题标题】:missing row in oracleoracle中缺少行
【发布时间】:2011-07-20 11:36:03
【问题描述】:
SELECT * 
FROM 
(
    SELECT stat, 
           SUM(DECODE(visa_country,'US',1,0)) AS USA,
           SUM(DECODE(visa_country,'United Kingdom',1,0)) AS UK,
           SUM(DECODE(visa_country,'Australia',1,0)) AS Australia,
           SUM(DECODE(visa_country,'Canada',1,0)) AS Canada,
           SUM(DECODE(visa_country,'Switzerland',1,0)) AS Switzerland,
           SUM(DECODE(visa_country,'Singapore',1,0)) AS Singapore,
           SUM(DECODE(visa_country,'Sweden',1,0)) AS Sweden,
           SUM(DECODE(visa_country,'Netherlands',1,0)) AS Netherlands
    FROM 
    (
        SELECT * 
        FROM
        (
            SELECT  stat,
                    visa_country,
                    DECODE(stat,'>= 0 '||'&'||' < 15', 1
                               ,'>= 15 '||'&'||' < 30',2
                               ,'>= 30 '||'&'||' < 45',3
                               ,'>= 45 '||'&'||' < 60',4
                               ,'>= 60 '||'&'||' < 75',5
                               ,'>= 75 '||'&'||' < 90',6
                               ,' >= 90',7) AS gr
            FROM (
                SELECT  end_date,
                        visa_country,
                        CASE WHEN END_DATE between 0 and 14 THEN '>= 0 '||'&'||' < 15'
                             WHEN END_DATE BETWEEN 15 AND 29 THEN '>= 15 '||'&'||' < 30'
                             WHEN END_DATE BETWEEN 30 AND 44 THEN '>= 30 '||'&'||' < 45'
                             WHEN END_DATE BETWEEN 45 AND 59 THEN '>= 45 '||'&'||' < 60'
                             WHEN END_DATE BETWEEN 60 AND 74 THEN '>= 60 '||'&'||' < 75'
                             WHEN END_DATE BETWEEN 75 AND 89 THEN '>= 75 '||'&'||' < 90'
                             WHEN END_DATE > 90 THEN  ' >= 90'   
                        END AS stat
                FROM 
                (
                    SELECT  visa_country,
                            GREATEST(
                                        NVL(TO_DATE(VP.WP_VALID_TILL,'DD-MON-YY'),TO_DATE(SYSDATE,'DD-MON-YY')),
                                        NVL(TO_DATE(VP.VISA_VALID_TILL,'DD-MON-YY'),to_DATE(SYSDATE,'DD-MON-YY'))
                                    )
                            - TO_DATE(SYSDATE,'DD-MON-YY') AS END_DATE 
                    FROM visa_prac AS vp 
                )
            ) AS x
            WHERE x.end_date > 0
        )       
    )  GROUP BY stat
    ORDER BY gr
)

这是给出员工数量的代码......但这里的问题是,如果任何计数为零,它不会显示整行......

假设没有任何细节在 >=75 &

将不胜感激您的帮助解决它。

【问题讨论】:

    标签: sql oracle11g


    【解决方案1】:

    我认为您需要删除 END 中的 WHERE 子句

    WHERE x.end_date &gt;0

    因为它在零的情况下过滤掉了行。

    select * from 
      (
          select stat, sum(decode(visa_country,'US',1,0))USA,
                 sum(decode(visa_country,'United Kingdom',1,0))UK,
                 sum(decode(visa_country,'Australia',1,0))Australia,
                 sum(decode(visa_country,'Canada',1,0)) Canada,
                 sum(decode(visa_country,'Switzerland',1,0))Switzerland,
                 sum(decode(visa_country,'Singapore',1,0))Singapore,
                 sum(decode(visa_country,'Sweden',1,0))Sweden,
                 sum(decode(visa_country,'Netherlands',1,0))Netherlands
          from 
                (
                select * FROM
                    (
                      SELECT stat,visa_country,DECODE(stat,'>= 0 '||'&'||' < 15',1,'>= 15 '||'&'||' < 30',2,'>= 30 '||'&'||' < 45',3,'>= 45 '||'&'||' < 60',4,'>= 60 '||'&'||' < 75' ,5,'>= 75 '||'&'||' < 90' ,6,' >= 90',7)gr
                        from (
                                select end_date,visa_country,case when END_DATE between 0 and 14 THEN '>= 0 '||'&'||' < 15'
                                  when END_DATE BETWEEN 15 AND 29 THEN '>= 15 '||'&'||' < 30'
                                  When END_DATE BETWEEN 30 AND 44 THEN '>= 30 '||'&'||' < 45'
                                  When END_DATE BETWEEN 45 AND 59 THEN '>= 45 '||'&'||' < 60'
                                  When END_DATE BETWEEN 60 AND 74 THEN '>= 60 '||'&'||' < 75'
                                  When END_DATE BETWEEN 75 AND 89 THEN '>= 75 '||'&'||' < 90'
                                  When END_DATE > 90 THEN  ' >= 90'   
                                     END stat
                              from (select visa_country,GREATEST(nvl(TO_DATE(VP.WP_VALID_TILL,'DD-MON-YY'),to_DATE(sysdate,'DD-MON-YY')),NVL(TO_DATE(VP.VISA_VALID_TILL,'DD-MON-YY'),to_DATE(sysdate,'DD-MON-YY')))
                              -to_DATE(sysdate,'DD-MON-YY') AS END_DATE from visa_prac vp )
    
                              )x 
                    )   
                )  group by stat
                order by gr
      )
    

    【讨论】:

    • 嗨 talha。我认为我在下面提到的代码的一部分存在问题。希望你理解整个代码的逻辑。我知道它的笨拙,我对此很陌生。请建议一些替代方案....选择 visa_country,GREATEST(nvl(TO_DATE(VP.WP_VALID_TILL,'DD-MON-YY'),to_DATE(sysdate,'DD-MON-YY')),NVL(TO_DATE(VP. VISA_VALID_TILL,'DD-MON-YY'),to_DATE(sysdate,'DD-MON-YY'))) -to_DATE(sysdate,'DD-MON-YY') AS END_DATE from visa_prac vp....我这个我我试图消除小于 sysdate 的日期。我将其设为零。所以如果我错过“WHERE x.end_date >0”,它也会给出旧记录
    • OK 所以你可以试试:WHERE x.end_date &gt;= 0 这将包括所有带零的行。
    • 不,它似乎不起作用...... :-( 我试过了,但仍然缺少该行。特别是 75 到 90,因为该行的所有列中都没有数据
    • >= 0 & = 15 & = 30 & = 45 & = 60 & = 90 96 8 6 3 1 1 2 3 这是输出..你可以看到 75到 90 缺失
    • 我认为你必须用&gt;=0 &amp; &lt;15, &gt;=15 &amp; &lt; 30, .... , &gt;= 90 的7 条记录创建另一个表并创建一个LEFT OUTER JOIN 并从新表中选择范围和当前实现中的值。
    猜你喜欢
    • 2023-04-03
    • 1970-01-01
    • 2023-01-31
    • 1970-01-01
    • 2021-11-10
    • 2014-08-30
    • 2016-06-23
    • 2019-05-08
    • 1970-01-01
    相关资源
    最近更新 更多