2011-10-21 58 views
0

我就用下面的代碼的報告工作:列對調,因爲ORDER BY的聲明

SELECT SUBS_PROV "PROV", SUM(PAID_AMT), 0, 0, 0, SUM(PAID_AMT) 
FROM H 
WHERE GRP = :P_POLICY AND 
&P_DATE BETWEEN :P_FROM_DATE AND :P_TO_DATE 
GROUP BY SUBS_PROV 
UNION ALL 

SELECT PROV "PROV", 0, SUM(PAID_AMT), 0, 0, SUM(PAID_AMT) 
FROM D 
WHERE GRP = :P_POLICY AND 
&P_DATE BETWEEN :P_FROM_DATE AND :P_TO_DATE 
GROUP BY PROV 
UNION ALL 

SELECT PROV "PROV", 0, 0, SUM(PAID_AMT), 0, SUM(PAID_AMT) 
FROM E 
WHERE GRP = :P_POLICY AND 
&P_DATE BETWEEN :P_FROM_DATE AND :P_TO_DATE 
GROUP BY PROV 
UNION ALL 

SELECT SUBS_PROV "PROV", 0, 0, 0, SUM(PAID_AMT), SUM(PAID_AMT) 
FROM R 
WHERE GRP = :P_POLICY AND 
&P_DATE BETWEEN :P_FROM_DATE AND :P_TO_DATE 
GROUP BY SUBS_PROV 

有在此查詢的數據模型共列,我要補充「ORDER BY」因爲在Oracle 11g組下不再有效。

當我在最後加上「ORDER BY 1」並運行報表時,它將T的總數與TOTAL列的總數顛倒。有沒有方法可以添加ORDER BY而不倒轉這些列?

謝謝!

+3

「 - 錯? – StevieG

+2

經過實證測試,我可以確認GROUP BY的確在11g中工作。因此,它必須使用它在11g中不起作用。 – Ollie

+0

@Ollie - 我懷疑問題是GROUP BY在11g中使用了更高效的散列算法(自10g以來已經完成),這意味着結果不再按聚合列排序。而在早期版本的Oracle GROUP BY中,返回結果排序。該文檔將此列爲不能依賴的設計副作用:只有ORDER BY保證排序順序。然而,在實踐中,GROUP BY做到了這麼多人依賴它的技巧,並且不用擔心額外的問題。因此,「Oracle 11g集團下不再有效」的衝擊。 – APC

回答

0

您應該在每個GROUP BY之後添加ORDER BY,而不是僅在最後。 「在Oracle 11g集團下不再有效」