2015-03-03 76 views
-2

我有一年,名12行,但我想1個一行年和名稱與(1或空)12寄存器。我需要的組名連續

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; 

我希望你能幫助我,非常感謝你!

+0

哇,夥計......請花時間格式化此代碼。 這是mySQL還是Oracle? – 2015-03-03 13:00:13

+0

是Oracle,現在我編輯代碼,謝謝。 – 2015-03-03 13:07:25

+0

我不能編輯代碼。需要
抱歉。 – 2015-03-03 14:08:34

回答

1

這個常見問題有幾種解決方案。

  1. 如果您使用的是Oracle 11g或更新版本,則可以使用PIVOT。 使用起來相當複雜。
  2. 您可以編寫PL/SQL函數,將return 'table'與所有你想要的任何格式你想要的數據。
  3. 您可以從雙重選擇包含所有月份數的一行,然後將它們與您的查詢(最好使用WITH語句)連接12次(每月一次)。
  4. 你也可以意識到你並不需要它在一行中,因爲可能 - 你沒有。 :)也許你可以修改你從數據庫中得到的結果,然後爲每個月創建一個列。或者你可以將其顯示爲表等...

我覺得有一些其他的解決方案爲好,但我建議你去數4 我記得有類似的問題經常與SQL在一開始,但他們現在只是消失。

我想你是從錯誤的角度來接近你的問題。

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; 

但是,使用樞軸查詢,如黑暗Anavger提到的,可能會是最正規的方法,如果你的輸出格式必須是單排有十二彙總列。

祝你好運!