SQL返回所有结果ALL,Distinct?

时间:2012-12-07 17:24:30

标签: mysql sql distinct

问题:即使在a.Month中找不到Month_Name,也需要查询返回b.Monthly_Yield的MONTH_NAME和YIELD。出于某种原因,如果在a.Month中找不到月份,即使我添加到选择b.month,查询仍然不会返回b.Monthly_Yield值。我现在拥有它的方式,如果在表“a”中找不到MONTH,但是在表“b”中找到月份,结果将不会返回。即使在“a”中找不到那个月,我也需要返回“b”的结果。

注意:“月”是月号

LETER OUTER JOIN的数据结果:

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 )

1 个答案:

答案 0 :(得分:1)

将LEFT OUTER JOIN改为RIGHT OUTER JOIN。

@ypercube是正确的。使用FULL OUTER JOIN。

您没有获得月份名称的原因是表格中现在有值。所以你需要从b表中获取它。

尝试

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

另外,请听取意见的建议。使用正确的数据类型函数。另请参阅CASE语句。

您还可能希望查询联接中的所有信息,然后对外部查询执行数据转换(月份名称)。这样你就不必两次了。