Sql,甚至使用UNION重复

时间:2014-07-07 16:57:29

标签: sql oracle

我正在尝试生成一个查询以返回过去4个月的汇总数据,而且几个月必须是静态的,我的意思是始终显示4行数据: 基本上这个结构:

month || sum(value)  
07    ||    1000
06    ||    0        
05    ||    3000
04    ||    500

收集数据的主表是:

trxs: {id(number), tah_fechaActualizacion(date), tah_monto(number) ,(others columns)}

我当前的查询:

        WITH temp AS (        
          SELECT TO_CHAR (trunc(a."tah_fechaActualizacion"), 'MM') AS "formatted_month", SUM (a."tah_monto") AS "ahorrado_por_tarjeta"
          FROM "trxs" a, 
            "inst" b
          WHERE a."tah_eta_id" = 1 /*filter*/
          AND a."tah_iah_id" = b."iah_id"
          AND  b."iah_idInstrumento" = '1349153200' /*filter*/
          GROUP BY a."tah_fechaActualizacion"
         )
        SELECT temp."formatted_month", temp."ahorrado_por_tarjeta" FROM temp
        UNION
        SELECT TO_CHAR(ADD_MONTHS(trunc(SYSDATE), -level + 1), 'MM') AS "formatted_month", TO_NUMBER(0) AS "ahorrado_por_tarjeta"
        FROM dual 
        WHERE 1 NOT IN (SELECT temp."formatted_month" FROM temp)
        CONNECT BY LEVEL <= 4
        ORDER BY 1 DESC

所以问题是你有几个月没有数据记录,所以查询的第一部分是不够的,因为它不返回行。我正在尝试使用此查询生成虚拟数据,但使用UNION返回重复项,如下所示:

07  0
06  0
06  45760
05  0
05  10000
04  0

仅运行查询的“temp”部分,返回:

05  10000
06  45760

我不知道我的查询有什么问题(使用UNION重复),如果这很奇怪或很复杂,你如何为这种情况生成虚拟数据行?

2 个答案:

答案 0 :(得分:2)

两个选择是(1)联合后的聚合或(2)左外连接。以下是左外连接的想法,其中生成月份,非匹配值的值为0

select mons.formatted_month, coalesce(temp.ahorrado_por_tarjeta, 0)
from (SELECT TO_CHAR(ADD_MONTHS(trunc(SYSDATE), -level + 1), 'MM') AS formatted_month
      FROM dual 
      WHERE 1 NOT IN (SELECT temp."formatted_month" FROM temp)
      CONNECT BY LEVEL <= 4
      ORDER BY 1 DESC
     ) mons left outer join
     temp
     on mons.formatted_month = temp.formatted_month;

答案 1 :(得分:0)

UNION删除重复项,是的,但是对于所有字段,意味着:

select 'A', 'B' from dual
union
select 'A', 'C' from dual

返回2行,即使第1列相同!正如戈登所说,你可以在SUM上进行UNION,或者在外联接中获取temp值(如果有的话),否则为虚拟值。