복붙노트

[SQL] 많은 열이 쿼리에서 하나의 열을 집계

SQL

많은 열이 쿼리에서 하나의 열을 집계

내가 쿼리에서 많은 열이있을 때 하나의 열을 집계하는 적절한 방법이 있나요?

나는 작동이 대답을 시도했지만, 내 쿼리는 더 자세한 많은되었다.

나의 현재 쿼리는 다음과 같습니다 :

SELECT t1.foo1, t1.foo2, t2.foo3, t2.foo4, string_agg(t3.aggregated_field, ', ')
FROM tbl1 t1
LEFT JOIN tbl2 t2 ON t1.id = t2.fkeyid
LEFT JOIN tbl3 t3 ON t2.id = t3.fkeyid
GROUP BY t1.foo1, t1.foo2, t2.foo3, t2.foo4, t2.foo5, t2.foo6
ORDER BY t2.foo5, t2.foo6

쿼리는 더 많은 필드를 가지고 있으며, 왼쪽은 중요한 부분이 모든 필드는 1 일 또는 1 사이비에 t3.aggregated_field으로 표시 I 집계 할 n으로 1 인 하나 개의 필드를 제외하고 0 관계를 가지고있다, 조인 위의 질의.

나는 집계 함수를 사용하고 있습니다 때, SELECT 및 ORDER BY에있는 모든 필드 중 하나를 집계 또는 그룹의 일부 BY 절해야합니다. 이것은 더 자세한 이미보다 내 쿼리 방법이 있습니다.

즉, foo1은 가정하면 기본 키,이 필드는 반복 될 경우, aggregated_field 제외한 모든 사람들도 동일이다. 나는 집계 필드 값을 하나의 행 결과 이러한 반복 행을 원한다. (기본적으로 응집 열과 구별 선택)

합니다 (GROUP BY의 다른 모든 필드를 넣지 않아도)이 할 수있는 더 좋은 방법이 있나요 또는해야 난 단지 반복 처리하십시오 1 N 관계를 가져 오는 각 행에 대해 쿼리를 실행 내 백엔드에서 결과 집합을 통해?

서버는 더 구체적으로, PostgreSQL의 9.1.9 실행 :

해결법

  1. ==============================

    1.이것은 나중에 PostgreSQL을 9.1로 훨씬 간단 할 수있다. As이 밀접하게 관련 질문에 대해 설명 :

    이것은 나중에 PostgreSQL을 9.1로 훨씬 간단 할 수있다. As이 밀접하게 관련 질문에 대해 설명 :

    그것은 테이블의 기본 키에 의해 GROUP에 충분하다. 이후:

    ... 당신은 당신의 예제를 단순화 할 수 있습니다 :

    SELECT foo1, foo2, foo3, foo4, foo5, foo6, string_agg(aggregated_field, ', ')
    FROM   tbl1
    GROUP  BY 1
    ORDER  BY foo7, foo8;  -- have to be spelled out, since not in select list!
    

    그러나 이후이 :

    ..보다 빠르고 간단 집계 처음에해야, 나중에 가입 :

    SELECT t1.foo1, t1.foo2, ...
         , t2.bar1, t2.bar2, ...
         , a.aggregated_col 
    FROM   tbl1 t1
    LEFT   JOIN tbl2 t2 ON ...
    ...
    LEFT   JOIN (
       SELECT some_id, string_agg(agg_col, ', ') AS aggregated_col
       FROM   agg_tbl a ON ...
       GROUP  BY some_id
       ) a ON a.some_id = ?.some_id
    ORDER  BY ...
    

    쿼리의 큰 부분이 전혀 집계를 필요로하지 않는다 이런 식으로.

    나는 최근에이 관련 대답 점을 증명하기 위해 SQL 바이올린의 테스트 케이스를 제공 :

    이 관련 답변을 참조하기 때문에 : 아니오, DISTINCT,이 경우에는 전혀 도움이 될 수 없습니다.

  2. ==============================

    2.주요 문제는 필드 (foox는) 다음 계산되는 경우이 도움이 될 수 있습니다 :

    주요 문제는 필드 (foox는) 다음 계산되는 경우이 도움이 될 수 있습니다 :

    SELECT foo1, foo2, foo3, foo4, foo5, foo6, string_agg(aggregated_field, ', ')
    FROM tbl1
    GROUP BY 1, 2, 3, 4, 5, 6
    ORDER BY 5, 6
    

    1, 2 ... 그들이 선택 목록에 나타나는 순서대로 필드입니다.

  3. from https://stackoverflow.com/questions/16018237/aggregate-a-single-column-in-query-with-many-columns by cc-by-sa and MIT license