2011-07-20 16 views
2
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 & < 90の範囲内に詳細がない場合は、その行が表示されないようにしてください。

ご理解のほどよろしくお願いいたします。

答えて

0

私はそれがZEROの場合に行を除外されているので、あなたがEND

WHERE x.end_date >0

WHERE句を削除する必要があると思います。

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 
) 
+0

こんにちはuはロジックが全体code.iをfdが理解below.hopeに言及イムコードF 1つの部分とDの問題sがその不器用を知っていると私はいくつかの代替を提案this.plzに非常に新しいと思うtalha.iこのためには、visa_country、GREATESTを選択してください。(NV_ TO_DATE(VP.WP_VALID_TILL、 'DD-MON-YY')、to_DATE(sysdate、 'DD-MON-YY'))、NVL(TO_DATE(VP.VISA_VALID_TILL、 visa_prac vp ....からEND_DATEまでの間、(DD-MON-YY))、to_DATE(sysdate、 'DD-MON-YY')))-to_DATE(sysdate、 'DD-MON-YY') sysdate.iよりも小さい日付を削除するには、ゼロを作成しています。 "WHERE x.end_date> 0"が間違っていると古いレコードも返されます – user853830

+0

OKこれで試してみることができます: 'WHERE x.end_date> = 0 'これにはZEROSのすべての行も含まれます。 –

+0

いいえ、それは動作していないようだ...... :-(私はそれを試したが、まだ行が欠けている。特にその行のすべての列にデータがないので、75から90 – user853830

関連する問題