데이터에 값을 기준으로 필드 값 연산하기 0 3 7,840

by 오버맨 [SQL Query] [2025.02.07 10:34:15]


안녕하세요. 월별로 값을 나타내는 A테이블있고 계산 방법을 가지고 있는 B 테이블이 있습니다.

2개의 테이블을 조인해서 DETAIL에 있는 로직을 반영한 값을 계산할 수 있을까요? (VALUE 값)

주기적으로 계산 방식이 변경될 수 있어 계산 방법에 대한 맵핑 테이블을 가지고 관리할려고 합니다.

 

* 더 효율적인 Detail 데이터에 구성 방식이 있으면 변경 가능합니다.

DB는 오라클 입니다.

A테이블

YYYYMM VV001 VV002 VV003 VV004 VV005 VV006 VV007 VV008 VV009 VV010
202501 665 693 610 932 595 821 745 899 738 673
202502 520 856 976 831 862 593 593 647 892 534
202503 755 739 514 582 769 713 959 578 523 587
202504 646 579 806 638 863 893 559 954 855 857
202505 971 991 547 920 574 952 952 623 668 689
202506 530 760 844 685 600 930 528 715 886 918
202507 581 946 818 595 595 986 558 610 962 963
202508 959 921 809 818 555 838 615 821 506 558
202509 527 982 713 541 912 603 776 800 753 764
202510 723 676 668 610 896 827 648 986 559 704
202511 702 635 850 951 639 807 844 556 976 857
202512 649 729 783 833 977 770 939 522 771 599

 

B 테이블

YYYYMM CATEGORY DETAIL VALUE
202501 Group1 VV001 + VV003 1275
202503 Group2 VV002 + VV005 1508
202510 Group3 VV004 - VV010  
202512 Group4 VV003 - (VV005 + VV006 + VV007)  
by 마농 [2025.02.07 11:20:07]
1
2
3
4
5
6
7
8
SELECT yyyymm, category, detail
     , TO_NUMBER(
       dbms_xmlgen.getxmltype(
       'SELECT ' || detail || ' v FROM t_a WHERE yyyymm = ''' || yyyymm || ''''
       ).Extract('//text()')
       ) v
  FROM t_b
;

 


by 오버맨 [2025.02.07 12:40:46]

답변 감사드립니다. 위에 내용대로 한다고 하면 이렇게도 가능 하다고 봐야될까요?

Table B

CATEGORY DETAIL
Group1 VV001 + VV003
Group2 VV002 + VV005
Group3 VV004 - VV010
Group4 VV003 - (VV005 + VV006 + VV007)

 

Table A

YYYYMM VV001 VV002 VV003 VV004 VV005 VV006 VV007 VV008 VV009 VV010 Group1 Group2 Group3 Group4
202501 665 693 610 932 595 821 745 899 738 673 1275 1288 259 -1551
202502 520 856 976 831 862 593 593 647 892 534 1496 1718 297 -1072
202503 755 739 514 582 769 713 959 578 523 587 1269 1508 -5 -1927
202504 646 579 806 638 863 893 559 954 855 857 1452 1442 -219 -1509
202505 971 991 547 920 574 952 952 623 668 689 1518 1565 231 -1931
202506 530 760 844 685 600 930 528 715 886 918 1374 1360 -233 -1214
202507 581 946 818 595 595 986 558 610 962 963 1399 1541 -368 -1321
202508 959 921 809 818 555 838 615 821 506 558 1768 1476 260 -1199
202509 527 982 713 541 912 603 776 800 753 764 1240 1894 -223 -1578
202510 723 676 668 610 896 827 648 986 559 704 1391 1572 -94 -1703
202511 702 635 850 951 639 807 844 556 976 857 1552 1274 94 -1440
202512 649 729 783 833 977 770 939 522 771 599 1432 1706 234 -1903

 

Table B에 정보를 가지고 기존 Table A 필드에서 Group에 갯수만큼 필드를 추가로 만들고 싶습니다.

또 한가지 궁금한게 대용량에 데이터에 경우 이렇게 사용해도 괜찮을까요? 


by 마농 [2025.02.07 14:38:09]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SELECT *
  FROM (SELECT yyyymm
             , vv001, vv002, vv003, vv004, vv005, vv006, vv007, vv008, vv009, vv010
             , category
             , TO_NUMBER(
               dbms_xmlgen.getxmltype(
               'SELECT ' || b.detail || ' v FROM t_a WHERE yyyymm = ''' || a.yyyymm || ''''
               ).Extract('//text()')
               ) v
          FROM t_a a
             , t_b b
        )
 PIVOT (MIN(v) FOR category IN ( 'Group1' Group1
                               , 'Group2' Group2
                               , 'Group3' Group3
                               , 'Group4' Group4
                               ) )
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입