我正在尝试生成一个查询以返回过去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重复),如果这很奇怪或很复杂,你如何为这种情况生成虚拟数据行?
答案 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
值(如果有的话),否则为虚拟值。