我需要连续分组名称

时间:2015-03-03 12:53:35

标签: group-by sql-order-by oracle-sqldeveloper case-when

我有12行年份和名称,但我想要年份1行和12个寄存器的名称(1或null)。

select id_agente, nombre, ene, feb, mar, abr, may, jun, jul, ago, sep, oct, nov, dic 
from (
   (select 
       a.id_agente id_agente,  
       a.NOMBRE nombre,
       case
           when to_char (to_date(dec.FECHA_RECOGIDA_ORIGEN,'dd/mm/yyyy'),'mm') = '01' then 1 end ene,
       case
           when to_char (to_date(dec.FECHA_RECOGIDA_ORIGEN,'dd/mm/yyyy'),'mm') = '02' then 1 end feb,
  ..................     
  )
  group by nombre, id_agente, ene, feb, mar, abr, may, jun, jul, ago, sep, oct, nov, dic 
  order by nombre, id_agente, ene, feb, mar, abr, may, jun, jul, ago, sep, oct, nov, dic;

我希望你帮助我,非常感谢你!

2 个答案:

答案 0 :(得分:1)

这个常见问题有几种解决方案。

  1. 如果您使用的是Oracle 11g或更高版本,则可以使用PIVOT。 使用它非常棘手。
  2. 你可以编写PL {SQL函数,它将return 'table'包含您想要的任何格式的所有数据。
  3. 您可以选择一行中包含所有月份数字的行,然后将其与您的查询(最好使用WITH语句)连接12次(每月一次)。
  4. 你也可以意识到你不需要一排,因为可能 - 你没有。 :)也许您可以修改结果,从数据库中获取结果,然后为每个月创建一列。或者也许您可以将它显示为表格等等......
  5. 我认为还有其他一些解决方案,但我建议你选择4号。 我记得在开始时经常使用SQL遇到类似的问题,但它们现在就消失了。

    我想你正在从错误的角度接近你的问题。

答案 1 :(得分:0)

一种方法,虽然详细,但是使用case语句定义每个聚合列作为要汇总的参数。然后,“group by”和“order by”子句只需要给出“id_agente”和“nombre”。我用Oracle数据多次使用过这种方法。

以下查询未经测试,并且做出了一些假设,但它至少应该是一个良好的开端。

select a.id_agente id_agente,  
       a.NOMBRE nombre,
       sum(case when to_char(to_date(dec.FECHA_RECOGIDA_ORIGEN,'dd/mm/yyyy'),'mm') = '01' then 1 else 0 end) ene,
       sum(case when to_char(to_date(dec.FECHA_RECOGIDA_ORIGEN,'dd/mm/yyyy'),'mm') = '02' then 1 else 0 end) feb,
       sum(case when to_char(to_date(dec.FECHA_RECOGIDA_ORIGEN,'dd/mm/yyyy'),'mm') = '03' then 1 else 0 end) mar,
       sum(case when to_char(to_date(dec.FECHA_RECOGIDA_ORIGEN,'dd/mm/yyyy'),'mm') = '04' then 1 else 0 end) abr,
       sum(case when to_char(to_date(dec.FECHA_RECOGIDA_ORIGEN,'dd/mm/yyyy'),'mm') = '05' then 1 else 0 end) may,
       sum(case when to_char(to_date(dec.FECHA_RECOGIDA_ORIGEN,'dd/mm/yyyy'),'mm') = '06' then 1 else 0 end) jun,
       sum(case when to_char(to_date(dec.FECHA_RECOGIDA_ORIGEN,'dd/mm/yyyy'),'mm') = '07' then 1 else 0 end) jul,
       sum(case when to_char(to_date(dec.FECHA_RECOGIDA_ORIGEN,'dd/mm/yyyy'),'mm') = '08' then 1 else 0 end) ago,
       sum(case when to_char(to_date(dec.FECHA_RECOGIDA_ORIGEN,'dd/mm/yyyy'),'mm') = '09' then 1 else 0 end) sep,
       sum(case when to_char(to_date(dec.FECHA_RECOGIDA_ORIGEN,'dd/mm/yyyy'),'mm') = '10' then 1 else 0 end) oct,
       sum(case when to_char(to_date(dec.FECHA_RECOGIDA_ORIGEN,'dd/mm/yyyy'),'mm') = '11' then 1 else 0 end) nov,
       sum(case when to_char(to_date(dec.FECHA_RECOGIDA_ORIGEN,'dd/mm/yyyy'),'mm') = '12' then 1 else 0 end) dic
  from dec
group by id_agente,
         nombre
order by id_agente,
         nombre;

但是,如果输出格式需要是包含12个汇总列的单行,那么使用像Dark Anavger提到的数据透视查询可能是最正式的方法。

祝你好运!