2017-01-26 10 views
1

に私は、Oracleの2つのバージョン、Oracle Database 11gのEnterprise Editionのリリース11.2.0.1.0ていない - 生産Oracle Database 11gのEnterprise Editionのリリース11.2.0.3を0.0 - 64ビットの生産クエリは、Oracleのバージョンで動作しますが、他の

そして私は、このSQLを持っている:

select an.idai, t1.fecha, 53, t1.val_d60, 0 
from 
     (select ides, cana, ctec, trunc(fecha_d60, 'MM') as fecha, val_d60, 
       row_number() over (partition by ides,cana,ctec, trunc(fecha_d60, 'MM') 
            order by val_d60 asc) as orden 
     from azul_estdata60 
     where idflagv = 11 
     and ides < 25 
     and fecha_d60 >= '01/01/2016' and fecha_d60 <= '31/12/2016' 
     and cana = 8 
     order by ides, cana, ctec, val_d60 desc 
    ) t1, 
     (select ides, cana, ctec, trunc(fecha_d60, 'MM') as fecha, 
     round(count(*)*.5,0) as percentil 
     from azul_estdata60 
     where idflagv in (11,12,13) 
     and ides < 25 
     and fecha_d60 >= '01/01/2016' and fecha_d60 <= '31/12/2016' 
     and cana = 8 
     group by ides, cana, ctec, trunc(fecha_d60, 'MM') 
    ) t2 
     inner join azul_analogin an 
     on an.cana = t2.cana 
     and an.ctec = t2.ctec and an.ides = t2.ides 
where t1.ides = t2.ides 
and t1.cana = t2.cana 
and t1.ctec = t2.ctec 
and t1.fecha = t2.fecha 
and orden = percentil; 

それは11.2.0.3.0に、私はこのエラーを取得し、11.2.0.1.0に動作しますが、:

ORA-00979: no es una expresión GROUP BY 
00979. 00000 - "not a GROUP BY expression" 
*Cause:  
*Action: 

これを解決するにはどうすればよいですか?

Thx。

+1

''01/01/2016''は**ではない**日付。 Oracleはフォーマット・マスクとして 'NLS_DATE_FORMAT'セッション・パラメータを使用して日付に暗黙的に変換しようとする可能性がありますが、このマスクが一致しないと変換は失敗します(パラメータはセッションの各ユーザーによって設定されるため、それは1人のユーザのために働くことができるので、デバッグするのは苦痛であり、他のユーザはそうではない)。 'TO_DATE('01/01/2016 '、' DD/MM/YYYY ')'またはANSI日付リテラル 'DATE' 2016-01-01''を使用する方が良いでしょう。 – MT0

+0

NLS_DATE_FORMATは 'DD/MM/YYYY'、スペイン語の形式ですが、とにかく日付を変更しますが、同じエラーが発生します。 – Darkerviti

+0

ポイントを逃す - ''01/01/2016''は文字列で日付ではありません。あなたが日付のための文字列を使用して暗黙的な変換に頼っているかどうかに関わらず、ユーザはセッションで 'NLS_DATE_FORMAT'を変更することができ、暗黙的な変換**に依存しているすべてのクエリを壊すので、 *クエリの変更。 – MT0

答えて

1

なぜこのエラーが発生するのかわかりません。あなたのクエリは構文的に良いように見えます。しかし、余分な複雑さ。私はそれを少し書き直そうとします。 まず、日付を日付として指定します。次に、2番目のサブクエリを除外し、最初のサブクエリでコンパイルします。そして結果的に私は次のようになる:

with azul_estdata60(cana, ctec, ides, fecha_d60,val_d60,idflagv) as (
select 8,123, 1, date'2016-01-01',200, 11 from dual union all 
select 8,123, 1, date'2016-01-03',2000, 11 from dual union all 
select 8,123, 1, date'2016-01-05',2000, 11 from dual union all 
select 8,123, 1, date'2016-01-06',20000, 11 from dual union all 
select 8,123, 1, date'2016-01-10',200000, 11 from dual union all 
select 8,123, 2, date'2016-02-01',201, 12 from dual union all 
select 8,123, 3, date'2016-03-01',203, 13 from dual union all 
select 8,123, 4, date'2016-04-01',205, 14 from dual union all 
select 8,123, 5, date'2016-05-01',219, 13 from dual union all 
select 8,123, 6, date'2017-01-01',260, 11 from dual) 
, azul_analogin (cana, ctec, ides, IDAI) as (
select 8,123, 1,991 from dual 
) 
select an.idai, t2.fecha, 53, t2.val_d60, 0 , percentil, orden 
from 
     (select ides, cana, ctec, trunc(fecha_d60, 'MM') as fecha, val_d60, 
       idflagv, 
       round((count(*) over (partition by ides, cana, ctec, trunc(fecha_d60, 'MM')))*0.5,0) as percentil, 
       row_number() over (partition by idflagv, ides,cana,ctec, trunc(fecha_d60, 'MM') 
             order by val_d60 asc) as orden 
     from azul_estdata60 
     where idflagv in (11,12,13) 
     and ides < 25 
     and fecha_d60 >= date'2016-01-01' and fecha_d60 < date'2017-01-01' 
     and cana = 8 
    ) t2 
     inner join azul_analogin an 
     on an.cana = t2.cana 
     and an.ctec = t2.ctec and an.ides = t2.ides 
where 1 = 1 
and orden = percentil 
and idflagv = 11 
+0

私はそれを取得、私は内側の結合部分をt2サブクエリに移動する場合、おそらくOracleパーサーのバグですか? – Darkerviti

関連する問題