[SQL] 한 행에 여러 행을 집계 오라클 SQL 쿼리가 있습니까? [복제]
SQL한 행에 여러 행을 집계 오라클 SQL 쿼리가 있습니까? [복제]
나는 모습이 좋아하는 테이블이 있습니다 :
A 1
A 2
B 1
B 2
그리고 나는 모습이 좋아하는 결과 세트를 생성하려면 :
A 1 2
B 1 2
이 작업을 수행 할 것이라는 SQL 문이 있습니까? 나는 오라클을 사용하고 있습니다.
관련 질문 :
해결법
-
==============================
1.그것은 당신이 사용하고있는 오라클의 버전에 따라 달라집니다. 그것은 wm_concat () 함수를 지원하는 경우, 당신은 단순히 같은 것을 할 수 있습니다 :
그것은 당신이 사용하고있는 오라클의 버전에 따라 달라집니다. 그것은 wm_concat () 함수를 지원하는 경우, 당신은 단순히 같은 것을 할 수 있습니다 :
SELECT field1, wm_concat(field2) FROM YourTable GROUP BY field2;
wm_concat ()는 기본적으로 MySQL의에서 () 단지 GROUP_CONCAT처럼 작동합니다. 그것은 문서화되지 않을 수 있으므로 SQLPLUS 올드 너희를 해고하고 거기 인 경우에 참조하십시오.
그것은이없는 경우에, 당신은 뭔가에게 동등한 자신을 구현하려는 것입니다. 당신은 oracle-base.com에서 문자열 집계 페이지에서이 작업을 수행하는 방법에 대한 몇 가지 지침을 찾을 수 있습니다.
-
==============================
2.오라클은 그 동안 개선 꽤 오래된 주제,하지만 다른 사람을 도울 수 있습니다.
오라클은 그 동안 개선 꽤 오래된 주제,하지만 다른 사람을 도울 수 있습니다.
LISTAGG 기능을 사용하면 (11g 적어도) 찾고있는 것입니다
-
==============================
3.오라클 10g +에서 :
오라클 10g +에서 :
SELECT * FROM ( SELECT * FROM mytable MODEL PARTITION BY (grouper) DIMENSION BY (ROW_NUMBER() OVER (PARTITION BY grouper ORDER BY id) AS rn) MEASURES (val, val AS group_concat, 0 AS mark) RULES SEQUENTIAL ORDER ( group_concat[rn > 1] ORDER BY rn = group_concat[CV() - 1] || ', ' || val[CV()], mark[ANY] ORDER BY rn = PRESENTV(mark[CV() + 1], 0, 1) ) ) WHERE mark = 1 ORDER BY grouper
설명에 대한 내 블로그에서이 문서를 참조하십시오 :
-
==============================
4.같은 것을보십시오 :
같은 것을보십시오 :
SELECT field1, RTRIM(REPLACE(REPLACE(XMLAgg(XMLElement("x", field2) ORDER BY field2), '<x>'), '</x>', ' ')) AS field2s FROM yourTable GROUP BY field1
자유롭게이 오라클 포럼에서 발견 대답에 의해 영감을 된.
편집 :이 솔루션은 105 행 같은 것을 포함하는 요청에 집중적 매우 자원을 증명했다. 존에 의해 제안 나는 사용자 정의 집계 함수에 의해이 교체 끝났다.
-
==============================
5.당신이 10g 가지고 있다면, 당신은 아래의 기능을 통해 이동해야합니다 :
당신이 10g 가지고 있다면, 당신은 아래의 기능을 통해 이동해야합니다 :
CREATE OR REPLACE FUNCTION get_separated_value (input_val in number) RETURN VARCHAR2 IS return_text VARCHAR2(10000) := NULL; BEGIN FOR x IN (SELECT col2 FROM table_name WHERE col1 = input_val) LOOP return_text := return_text || ' ' || x.col2 ; END LOOP; RETURN return_text; END; /
그래서, 당신은 같이 할 수 있습니다 :
select col1, get_separated_value(col1) from table_name
여기 바이올린
당신은 오라클 11g를 가지고 있다면, 당신은 listagg을 사용할 수 있습니다 :
SELECT age, LISTAGG(name, ' ') WITHIN GROUP (ORDER BY name) "names" FROM table_x GROUP BY age
Listagg 여기 바이올린
-
==============================
6.사용자가 집계 함수를 정의 : http://www.adp-gmbh.ch/ora/sql/user_def_agg.html
사용자가 집계 함수를 정의 : http://www.adp-gmbh.ch/ora/sql/user_def_agg.html
그냥 / 붙여 넣기를 사용하여 복사합니다. 9i의에서 작동합니다.
-
==============================
7.
SELECT a , COLLECT(b) FROM foo GROUP BY a
사용자 정의 컬렉션에 주조 할 수있다 - PL / SQL은 매우 유용하게 사용하는 경우.
from https://stackoverflow.com/questions/1120706/is-there-an-oracle-sql-query-that-aggregates-multiple-rows-into-one-row by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 오라클 SQL 쿼리 : 시간을 기준으로 그룹 별 최신 값을 검색 [중복] (0) | 2020.03.16 |
---|---|
[SQL] 엔티티 프레임 워크 수동으로 키를 입력 (0) | 2020.03.16 |
[SQL] SQL 구문의 경우 민감한인가? (0) | 2020.03.16 |
[SQL] 어떻게 된 PreparedStatement의 SQL을받을 수 있나요? (0) | 2020.03.16 |
[SQL] SQL IN 절 1000 항목 제한 (0) | 2020.03.16 |