2015-12-02 142 views
0

我有以下查詢的Oracle 10g組

select mem.irsc_zona, 
(case 
    when mem.irsc_membres = 1 
    then mem.irsc_valor 
end) "1 membre", 
(case 
    when mem.irsc_membres = 2 
    then mem.irsc_valor 
end) "2 membres", 
(case 
    when mem.irsc_membres = 3 
    then mem.irsc_valor 
end) "3 membres", 
(case 
    when mem.irsc_membres = 4 
    then mem.irsc_valor 
end) "4 membres" 
from 
(select aip.irsc_zona, aip.irsc_membres, aip.irsc_valor from 
ajt_irsc_peu aip 
where aip.IRSC_FACTOR = '2.35' 
and aip.IRSC_DATA_FI = TO_DATE('31/12/15')) mem; 

返回以下

+-----------+----------+-----------+-----------+-----------+ 
| IRSC_ZONA | 1 membre | 2 membres | 3 membres | 4 membres | 
+-----------+----------+-----------+-----------+-----------+ 
| A   | 2080,46 |   |   |   | 
| A   |   | 2144,81 |   |   | 
| A   |   |   | 2237,06 |   | 
| A   |   |   |   | 2311,62 | 
| B   | 1950,43 |   |   |   | 
| B   |   | 2010,76 |   |   | 
| B   |   |   | 2097,24 |   | 
| B   |   |   |   | 2167,14 | 
| C   | 1835,7 |   |   |   | 
| C   |   | 1892,48 |   |   | 
| C   |   |   | 1973,87 |   | 
| C   |   |   |   | 2039,66 | 
| D   | 1560,35 |   |   |   | 
| D   |   | 1608,61 |   |   | 
| D   |   |   | 1677,79 |   | 
| D   |   |   |   | 1733,72 | 
+-----------+----------+-----------+-----------+-----------+ 

我想有以下結果:

+-----------+----------+-----------+-----------+-----------+ 
| IRSC_ZONA | 1 membre | 2 membres | 3 membres | 4 membres | 
+-----------+----------+-----------+-----------+-----------+ 
| A   | 2080,46 | 2144,81 | 2237,06 | 2311,62 | 
| B   | 1950,43 | 2010,76 | 2097,24 | 2167,14 | 
| C   | 1835,7 | 1892,48 | 1973,87 | 2039,66 | 
| D   | 1560,35 | 1608,61 | 1677,79 | 1733,72 | 
+-----------+----------+-----------+-----------+-----------+ 

所以,我想有結果按IRSC_ZONA分組,問題是我得到:

ORA-00979: no es una expresión GROUP BY 
00979. 00000 - "not a GROUP BY expression" 
*Cause:  
*Action: 
Error en la línea: 4, columna: 8 

我不知道如何重構我的查詢以獲得預期結果。

希望我的問題很清楚。 如果不是,請告訴我如何提供更多細節。

在此先感謝,

回答

0

您忘記在您的case語句中添加聚合函數。

類似下面應該做的伎倆(很明顯,你會用你的實際查詢的地方,我用「SAMPLE_DATA」):

with sample_data as (select 'A' irsc_zona, 2080.46 irsc_valor, 1 irsc_membres from dual union all 
        select 'A' irsc_zona, 2144.81 irsc_valor, 2 irsc_membres from dual union all 
        select 'A' irsc_zona, 2237.06 irsc_valor, 3 irsc_membres from dual union all 
        select 'A' irsc_zona, 2311.62 irsc_valor, 4 irsc_membres from dual union all 
        select 'B' irsc_zona, 1950.43 irsc_valor, 1 irsc_membres from dual union all 
        select 'B' irsc_zona, 2010.76 irsc_valor, 2 irsc_membres from dual union all 
        select 'B' irsc_zona, 2097.24 irsc_valor, 3 irsc_membres from dual union all 
        select 'B' irsc_zona, 2167.14 irsc_valor, 4 irsc_membres from dual union all 
        select 'C' irsc_zona, 1835.7 irsc_valor, 1 irsc_membres from dual union all 
        select 'C' irsc_zona, 1892.48 irsc_valor, 2 irsc_membres from dual union all 
        select 'C' irsc_zona, 1973.87 irsc_valor, 3 irsc_membres from dual union all 
        select 'C' irsc_zona, 2039.66 irsc_valor, 4 irsc_membres from dual union all 
        select 'D' irsc_zona, 1560.35 irsc_valor, 1 irsc_membres from dual union all 
        select 'D' irsc_zona, 1608.61 irsc_valor, 2 irsc_membres from dual union all 
        select 'D' irsc_zona, 1677.79 irsc_valor, 3 irsc_membres from dual union all 
        select 'D' irsc_zona, 1733.72 irsc_valor, 4 irsc_membres from dual) 
select irsc_zona, 
     sum(decode(irsc_membres, 1, irsc_valor)) "1 membre", 
     sum(decode(irsc_membres, 2, irsc_valor)) "2 membre", 
     sum(decode(irsc_membres, 3, irsc_valor)) "3 membre", 
     sum(decode(irsc_membres, 4, irsc_valor)) "4 membre" 
from sample_data 
group by irsc_zona 
order by irsc_zona; 

IRSC_ZONA 1 membre 2 membre 3 membre 4 membre 
--------- ---------- ---------- ---------- ---------- 
A   2080.46 2144.81 2237.06 2311.62 
B   1950.43 2010.76 2097.24 2167.14 
C    1835.7 1892.48 1973.87 2039.66 
D   1560.35 1608.61 1677.79 1733.72 

注:你會注意到我轉向使用解碼語句,這主要是因爲它使查詢更具可讀性,因爲它佔用的空間更少。我也使用SUM作爲聚合函數,以防萬一您可能有多個zona和membres行。

+0

非常感謝!這正是我需要的!只要我獲得了我的聲望,我會將其標記爲正確的答案。不幸的是,還不能。 –

+0

標記爲正確!正在嘗試upvote而不是將其檢查爲正確答案。再次感謝您的時間! –

+0

不客氣!無論如何,你總是在那裏 - 你只是缺少sum()/ max()來聚合數據* {:-) – Boneist