오라클 행의 여러 열에서 피벗 사용
Oracle 테이블에 다음과 같은 샘플 데이터가 있습니다(tab1행을 열로 변환하려고 합니다.한 열에서 Oracle 피벗을 사용하는 방법을 알고 있습니다.하지만 여러 개의 열에 적용할 수 있습니까?
표본 데이터:
Type weight height
A 50 10
A 60 12
B 40 8
C 30 15
내가 의도한 출력:
A-count B-count C-count A-weight B-weight C-weight A-height B-height C-height
2 1 1 110 40 30 22 8 15
할 수 있는 일:
with T AS
(select type, weight from tab1 )
select * from T
PIVOT (
count(type)
for type in (A, B, C, D,E,F)
)
위의 쿼리는 아래의 결과를 제공합니다.
A B C
2 1 1
대체할 수 있습니다.count(*)와 함께sum(weight)또는sum(height)높이 또는 무게를 피벗합니다.제가 찾고 있지만 할 수 없는 것은 하나의 쿼리에서 세 가지(카운트, 체중 및 키) 모두에서 피벗하는 것입니다.
피벗을 사용하여 수행할 수 있습니까?
설명서에서 알 수 있듯이 집계 함수 절을 여러 개 가질 수 있습니다.이렇게 할 수 있습니다.
select * from (
select * from tab1
)
pivot (
count(type) as ct, sum(weight) as wt, sum(height) as ht
for type in ('A' as A, 'B' as B, 'C' as C)
);
A_CT A_WT A_HT B_CT B_WT B_HT C_CT C_WT C_HT
---- ---- ---- ---- ---- ---- ---- ---- ----
2 110 22 1 40 8 1 30 15
표시한 순서대로 열을 표시하려면 다른 수준의 하위 쿼리를 추가합니다.
select a_ct, b_ct, c_ct, a_wt, b_wt, c_wt, a_ht, b_ht, c_ht
from (
select * from (
select * from tab1
)
pivot (
count(type) as ct, sum(weight) as wt, sum(height) as ht
for type in ('A' as A, 'B' as B, 'C' as C)
)
);
A_CT B_CT C_CT A_WT B_WT C_WT A_HT B_HT C_HT
---- ---- ---- ---- ---- ---- ---- ---- ----
2 1 1 110 40 30 22 8 15
열 이름을 지정하는 두 번째 접근 방식은 훨씬 더 낫고 더 많은 문제를 해결합니다.저는 피벗에서 반환된 데이터를 합산하여 열 이름을 가지고 2를 추가하고 세 번째 열에 필요한 결과를 얻을 수 있는 요구 사항이 있었습니다.
select a_ct, b_ct, c_ct, a_wt, b_wt, c_wt, a_ht, b_ht, c_ht, a_wt + b_wt + c_wt tot_wt
from (
select * from (
select * from tab1
)
pivot (
count(type) as ct, sum(weight) as wt, sum(height) as ht
for type in ('A' as A, 'B' as B, 'C' as C)
)
);
A_CT B_CT C_CT A_WT B_WT C_WT A_HT B_HT C_HT TOT_WT
---- ---- ---- ---- ---- ---- ---- ---- ---- ------
2 1 1 110 40 30 22 8 15 180
사용된 피벗 열 중 하나가 null을 반환하는 경우 집계 함수(합계와 같은)가 예상대로 작동하지 않습니다. 이 경우 CASE 문을 사용하여 해결했습니다.
누군가에게 도움이 되길 바랍니다.
Alex Pool의 답변은 훌륭했고 Oracle 쿼리에 도움이 되었습니다.이것은 저에게 호기심을 불러일으켰습니다. 여기서 저는 마이크로소프트 피벗용 오라클의 여러 열에 대한 구문 비교를 빠르게 지적하겠습니다.이것은 Oracle에게 SQL Simpler Syntax Award(SQL Simpler Syntax Award)를 수여하는 분야 중 하나입니다.
Microsoft SQL은 여러 열을 피벗해야 할 때처럼 단순하고 유연하지 않습니다.
- 원래 그룹화 필드를 연결하여 구분해야 합니다.
- MSFT SQL에서는 열 이름 별칭 지정이 훨씬 수동적입니다. 아래 코드에는 별칭 지정이 없습니다.
- 여러 피벗 호출을 수행해야 합니다.
- 구문 오류를 방지하려면 피벗 함수에 별칭을 지정해야 합니다.
- 이 모든 것을 고려하더라도 여전히 원하는 대로 그룹화되지 않습니다.
- Oracle은 SQL Simple Syntax Award를 수상했습니다.
동일한 데이터 세트가 지정된 경우:
DECLARE @tblSampleData AS table (Type nvarchar(10), Weight numeric(5,2), Height numeric(5,2))
INSERT INTO @tblSampleData (Type, Weight, Height)
VALUES
('A', 50, 10)
,('A', 60, 12)
,('B', 40, 8 )
,('C', 30, 15)
Microsoft SQL:
select * from
(
select
*
,concat(Type,'1') as "Type1"
,concat(Type,'2') as "Type2"
from @tblSampleData
) AS src
pivot (
count(Type) --as ct, sum(weight) as wt, sum(height) as ht
for Type in ([A], [B], [C])
) AS pvt1
pivot (
sum(weight) --as ct, sum(weight) as wt, sum(height) as ht
for Type1 in ([A1], [B1], [C1])
) AS pvt1
pivot (
sum(height) --as ct, sum(weight) as wt, sum(height) as ht
for Type2 in ([A2], [B2], [C2])
) AS pvt1
언급URL : https://stackoverflow.com/questions/23939244/using-pivot-on-multiple-columns-of-an-oracle-row
'programing' 카테고리의 다른 글
| 함수에 data.frame 열 이름 전달 (0) | 2023.06.08 |
|---|---|
| Python에서 매우 높은 품질로 이미지 저장 (0) | 2023.06.08 |
| TypeScript Playground로 라이브러리를 가져오는 방법 (0) | 2023.06.08 |
| Python3 오류: initial_value는 Str 또는 None(문자열 포함)이어야 합니다.IO (0) | 2023.06.08 |
| NPOI로 작성된 Excel 문서에서 열을 '자동 크기'로 설정하려면 어떻게 해야 합니까? (0) | 2023.06.08 |
