2011-12-23 4 views
1

나는이 다음GROUP BY를 사용하지 않고 집계하는 방법은 무엇입니까?

SELECT a.*, b.* 

(SELECT ATTR1, ATTR2, sum(QUANTITY) AS TOTAL_QTY, 
ATTR3 FROM TABLE_A 
WHERE ATTR4 > 0 
GROUP BY ATTR1, ATTR2, ATTR3) a, 

TABLE_B b 

WHERE a.ATTR1 = b.ATTR1 
AND a.ATTR2 = b.ATTR2 

난 단지 ATTR1 올바른 TOTAL_QTY을 계산하는 것이 아니라 오라클이 필요하기 때문에 유일한 이유는 내가 다른 속성을 그룹화하고 GROUP BY 필요 같은 쿼리 GROUP BY 조항이있는 경우 모든 SELECT 속성이해야 GROUP BY 절도 있습니다.

이것은 Table_A에서이 쿼리의 특성이 필요할 때마다 GROUP BY에도 넣어야 함을 의미합니다. 그것은 못 생겼을뿐 아니라 성능에 영향을 미칠 수 있으며 부작용을 미처 예상하지 못할 수 있습니다.

GROUP BY 절없이 각 ATTR1 그룹의 TOTAL_QTY을 계산하려면 위의 쿼리를 어떻게 다시 작성해야합니까?

+2

집합체의 특성이므로 그룹화해야합니다. 그렇지 않은 경우 시스템은 합계를 원하거나 행을 구성하는 방법을 모릅니다. 이 효과를 제거하는 유일한 방법은 다른 열 max (attr1), max (attr2)에서 집계를 사용하는 것입니다. 그러나 attr1과 attr2가 다른 행에 대해 다른 값을 갖는 경우 group by이 더 나은 옵션 인 이유를 빨리 알 수 있습니다. 동일한 열 – xQbert

+0

"오라클은 GROUP BY 절이 있으면 모든 SELECT 특성이 GROUP BY 절에도 있어야한다고 요구합니다." 사실이 아닙니다. 또한 집계 될 수 있습니다. 원하는 그룹화 항목의 주어진 값에 대해 다른 값이 항상 일정하면 MAX와 같은 함수를 사용할 수 있습니다. –

+2

찾고있는 내용이 잘못 정의되어 있습니다. 'attr1'에 대해 같은 값을 갖고'attr2'에 대해 다른 값을 가진 두 개의 행이 있다고 가정 해보십시오. 결과 집합이이 경우처럼 보이길 바랄까요? –

답변

8

오라클 분석 기능을 사용하십시오. 같은 것으로 table_a의 인라인보기 변경 :

select attr1, 
     attr2, 
     sum(quantity) over (partition by attr1 order by attr1) as total_qty, 
     attr3 
from table_a 
where attr4 > 0 

이 조금 조정해야 할 수도 있습니다,하지만 기본적인 생각이다.

+0

이전 버전과 얼마나 비슷한 윈도우 집계 함수가 있습니까? 11g 만? 10g? – MatBailie

+0

8.x에서 도입되었습니다. –

+2

+1 "인라인 집합"에 대한이 기술은 PostgreSQL 및 SQL Server 2005+에도 적용됩니다. – gbn

2

시도 :

SELECT a.*, b.* 
from (SELECT ATTR1, 
      max(ATTR2) ATTR2, 
      sum(QUANTITY) AS TOTAL_QTY, 
      max(ATTR3) ATTR3 
     FROM TABLE_A 
     WHERE ATTR4 > 0 
     GROUP BY ATTR1) a, 
     TABLE_B b 
WHERE a.ATTR1 = b.ATTR1 
AND a.ATTR2 = b.ATTR2 

(ATTR1의 각각의 주어진 값에 대해 ATTR2 및 ATTR3의 값이 일정하다고 가정합니다 - 즉, 그들은 기능적으로 그것에 따라 달라집니다..) 답변에서

+0

'Attr2','attr3' 등은 유일하지 않을 수 있습니다. – AppleGrew

+0

@AppleGrew : 그 답변은 귀하의 질문에 대한 Dave Costa의 의견에 대한 귀하의 답변과 모순 된 것으로 보입니다. 무엇 이니? –

+0

이 주석은'attr1'에만 해당합니다. 다른 속성은 뚜렷하거나 다를 수 있습니다. – AppleGrew

1

에 위의 내 의견은 ATTR1 값 당 하나의 그룹을 원하는 것처럼 들리고 단순히 해당 그룹에 속한 ATTR2 값을 원할 것입니다. 당신은 단순히 그룹 쿼리에 ATTR2MAX 또는 MIN을 적용하여이 작업을 수행 할 수 있습니다

SELECT a.*, b.* 
FROM 
(SELECT ATTR1, max(ATTR2) attr2, sum(QUANTITY) AS TOTAL_QTY, 
ATTR3 FROM TABLE_A 
WHERE ATTR4 > 0 
GROUP BY ATTR1, ATTR2, ATTR3) a, 
TABLE_B b 
WHERE a.ATTR1 = b.ATTR1 
AND a.ATTR2 = b.ATTR2 

이 방법은 임의로 그룹에있는 모든 것과 ATTR2에 대한 단일 값을 따기 수 있습니다.

관련 문제