create table test(x_coordi number, y_coordi number, value number);
insert into test values(1, 1, 1);
insert into test values(1, 2, 2);
insert into test values(2, 1, 3);
insert into test values(2, 2, 4);
insert into test values(3, 1, 5);
insert into test values(3, 2, 6);
insert into test values(1, 1, 1);
insert into test values(2, 1, 2);
insert into test values(1, 2, 3);
insert into test values(2, 2, 4);
insert into test values(1, 3, 5);
insert into test values(2, 3, 6);
* [1 2]
[1 3 5] * [3 4] = 1*1 3*3 5*5 2*1 4*3 6*5 = 35 44
[2 4 6] * [5 6] = 2*1 4*3 6*5 2*2 4*4 6*6 = 44 56
행렬계산인데요...
요 값을 이용해서 35 44
44 56
을 추출해야하는데 어떻게해야하는지,.. 시작한지 얼마 안되서 머리깨질거같아요..
Comment 7
-
건우아빠
2013.10.08 00:44
-
건우아빠
2013.10.08 09:55
행렬만 생각하고...
질문의 예제 테이블의 내용을 생각치 않았네요... ㅎㅎ
일단 행렬의 구분이 필요합니다. a,b이라는 구분이 있으면 테이블에는 이미 행과열로 이미 분리가 되어 있으니까..
unpivot을 하실 필요없이 쿼리를 하시고 pivot으로 처리하시면 원하시는 결과를 손쉽게만드실듯 합니다.
-
건우아빠
2013.10.08 10:12
create table test(metrix char(1), x_coordi int, y_coordi int, value int);
insert into test values('A',1, 1, 1);
insert into test values('A',1, 2, 2);
insert into test values('A',2, 1, 3);
insert into test values('A',2, 2, 4);
insert into test values('A',3, 1, 5);
insert into test values('A',3, 2, 6);insert into test values('B',1, 1, 1);
insert into test values('B',2, 1, 2);
insert into test values('B',1, 2, 3);
insert into test values('B',2, 2, 4);
insert into test values('B',1, 3, 5);
insert into test values('B',2, 3, 6);
with
ra as (
select x_coordi , y_coordi , value
from test
where metrix = 'A' ) ,
rb as (
select x_coordi , y_coordi , value
from test
where metrix = 'B' )
select *
from (
select ra.y_coordi x_coordi
, rb.x_coordi y_coordi
, sum(ra.value * rb.value) value
from ra join rb on ra.x_coordi = rb.y_coordi
group by rb.x_coordi , ra.y_coordi
) res
pivot
(
sum(value)
for y_coordi in
([1],[2]) --> 이 부분만 행렬의 크기에 따라 변경) as pi
-
건우아빠
2013.10.08 10:44
한 테이블에 값이 저장이 되어 있어서
두행렬값을 따로 ra,rb로 분리 한겁니다. 이걸 인라인뷰로 하셔도 되니다.
pivot은 리스트 형태의 자료를 표 형태로 표현하는 방법입니다.
행,열을 가지고 행렬의 형태로 표현을 한것입니다.
단계적으로 실행을 해 보시면 됩니다...
행렬으 곱으 계산 방법을 보면
A(2,3) * B(3,2) -> AB(2,2) 이 됩니다.
B(3,2) * A(2,3) --> BA(3,3) 이 되겠죠....
결국 A의 3열과 B의 3행을 기준으로 곱이 이루어집니다. 물론 값이 다르면 곱은 이루어지지 않게 되구요.
A(3,2) * B(3,2)은 곱이 이루어 지지 않게 됩니다.
-
쉽다고생각해
2013.10.08 10:48
res랑 pi는 어떤거죠;; ㅠㅠㅠㅠㅠ ... 무능한 저를 용서해주세요
-
건우아빠
2013.10.08 10:49
ALIAS 입니다. AS PI
-
쉽다고생각해
2013.10.08 11:02
와 건우아빠님 덕분에 많이 알아갑니다^^ !!
열심히할께요 감사합니다 !!!
unpivot -> pivot
(2,3) *(3,2) --> (2,2)
; WITH
A AS (
SELECT 1 ROW,1 [1], 3 [2], 5 [3] UNION ALL
SELECT 2 ROW,2 [1], 4 [2], 6 [3] ) ,
B AS (
SELECT 1 ROW,1 [1], 2 [2] UNION ALL
SELECT 2 ROW,3 [1], 4 [2] UNION ALL
SELECT 3 ROW,5 [1], 6 [2]
) ,
RA AS (
SELECT ROW,COL ,VALUE
FROM A
UNPIVOT
( VALUE FOR COL IN ( [1],[2],[3] ) ) AS P
) ,
RB AS (
SELECT COL ROW , ROW COL,VALUE
FROM B
UNPIVOT
( VALUE FOR COL IN ( [1],[2] ) ) AS P
)
SELECT RA.ROW, RB.ROW , SUM(RA.VALUE * RB.VALUE) VAL
FROM RA JOIN RB ON RA.COL = RB.COL
GROUP BY RA.ROW, RB.ROW
결과 쿼리를 pivot으로 처리 하시면 원하는 결과가 나올듯 합니다. .