0

問題:Month_Nameがa.Monthに見つからない場合でも、b.Monthly_YieldのMONTH_NAMEとYIELDを返すクエリが必要です。何らかの理由で、月がa.Monthに見つからない場合、選択範囲b.monthに追加しても、クエリはb.Monthly_Yield値を返しません。私が今持っている方法では、月がテーブル "a"に見つからないが、月がテーブル "b"にある場合、結果は返されません。「a」にその月が見つからなくても、「b」の結果を返す必要があります。

注:「月」は月番号です

左外部結合によるデータ結果:

Month  Month_Name  Yield_1  Yield_0
------------------------------------
2      Febrero     11.44    14
3      Marzo       NULL     3.21
4      Abril       NULL     14.24
7      Julio       NULL     10.36
8      Agosto      NULL     0
9      Septiembre  NULL     -9.6
10     Octubre     NULL     10.35
11     Noviembre   NULL     1.4
12     Diciembre   11.44    -1.18

右外部結合によるデータ結果:

Month  Month_Name  Yield_1  Yield_0
------------------------------------
NULL   NULL        11.44    NULL
2      Febrero     11.44    14
12     Diciembre   11.44    -1.18

クエリ:

SET @ID_CARTERA = 8;

select     
    a.Month,
    a.Month_Name,
    a.Monthly_Yield,
    b.Monthly_Yield

from
( select  
      RIGHT(A.F_ANOMES, 2) Month,
      IF(RIGHT(A.F_ANOMES, 2)=01,'Enero',
      IF(RIGHT(A.F_ANOMES, 2)=02,'Febrero',
      IF(RIGHT(A.F_ANOMES, 2)=03,'Marzo',
      IF(RIGHT(A.F_ANOMES, 2)=04,'Abril',
      IF(RIGHT(A.F_ANOMES, 2)=05,'Mayo',
      IF(RIGHT(A.F_ANOMES, 2)=06,'Junio',
      IF(RIGHT(A.F_ANOMES, 2)=07,'Julio',
      IF(RIGHT(A.F_ANOMES, 2)=08,'Agosto',
      IF(RIGHT(A.F_ANOMES, 2)=09,'Septiembre',
      IF(RIGHT(A.F_ANOMES, 2)=10,'Octubre',
      IF(RIGHT(A.F_ANOMES, 2)=11,'Noviembre',
      IF(RIGHT(A.F_ANOMES, 2)=12,'Diciembre',
      '')
      ))))))))))) Month_Name,

      ROUND(A.POR_RENTABILIDAD, 2) Monthly_Yield

from      dr_rent_carteras_meses A
where     A.ID_CARTERA = @ID_CARTERA
And       A.IND_RENTABILIDAD = 1
And       LEFT(A.F_ANOMES, 4) = ( select MAX(left(F_ANOMES, 4 ) ) - 0
                                  from dr_rent_carteras_meses
                                  where ID_CARTERA = @ID_CARTERA ) ) a

left outer join 
    ( select  
      RIGHT(A.F_ANOMES, 2) Month,
      IF(RIGHT(A.F_ANOMES, 2)=01,'Enero',
      IF(RIGHT(A.F_ANOMES, 2)=02,'Febrero',
      IF(RIGHT(A.F_ANOMES, 2)=03,'Marzo',
      IF(RIGHT(A.F_ANOMES, 2)=04,'Abril',
      IF(RIGHT(A.F_ANOMES, 2)=05,'Mayo',
      IF(RIGHT(A.F_ANOMES, 2)=06,'Junio',
      IF(RIGHT(A.F_ANOMES, 2)=07,'Julio',
      IF(RIGHT(A.F_ANOMES, 2)=08,'Agosto',
      IF(RIGHT(A.F_ANOMES, 2)=09,'Septiembre',
      IF(RIGHT(A.F_ANOMES, 2)=10,'Octubre',
      IF(RIGHT(A.F_ANOMES, 2)=11,'Noviembre',
      IF(RIGHT(A.F_ANOMES, 2)=12,'Diciembre',
      '')
      ))))))))))) Month_Name,

      ROUND(A.POR_RENTABILIDAD, 2) Monthly_Yield

from      dr_rent_carteras_meses A
where     A.ID_CARTERA = @ID_CARTERA
And       A.IND_RENTABILIDAD = 1
And       LEFT(A.F_ANOMES, 4) = ( select MAX(left(F_ANOMES, 4 ) ) - 1
                                  from dr_rent_carteras_meses
                                  where ID_CARTERA = @ID_CARTERA ) ) b on ( a.Month = b.Month )
4

1 に答える 1

1

LEFTOUTERJOINをRIGHTOUTERJOINに変更します。

@ypercubeは正しいです。FULLOUTERJOINを使用してください。

月の名前が表示されない理由は、テーブルに値があるためです。したがって、bテーブルから取得する必要があります。

試す

ISNULL(a.Month, b.Month) as Month
ISNULL(a.Month_Name, b.Month_Name) as Month

また、コメントのアドバイスをお願いします。正しいデータ型関数を使用してください。CASEステートメントも調べてください。

また、結合内のすべての情報をクエリしてから、外部クエリでデータ変換(月名)を実行することもできます。そうすれば、2回行う必要はありません。

于 2012-12-07T17:28:53.443 に答える