posted by 지긋이 2020. 3. 18. 14:55
SEQ SABUN CODE RESULT_MON RMON
201907001 rosebay 110 3441015 3280022
201907001 rosebay 113 160993 160993
201907001 rosebay 230 1288770 1288770

위와 같은 값이 출력된다고 할 때 110 CODE의 RESULT_MON컬럼과 RMON처럼 연산이 필요할 때라면?
아우터 조인을 활용해 보자.

SELECT
  A.SEQ, A.SABUN, A.CODE, A.RESULT_MON,
  DECODE(A.CODE,'110',(A.RESULT_MON-B.RESULT_MON), A.RESULT_MON) RMON
FROM TB_PAY A
LEFT JOIN TB_PAY
ON A.ENTER_CD = B.ENTER_CD --PK KEY1
AND A.SEQ= B.SEQ
AND A.SABUN = B.SABUN
AND B.CODE= '113'  
WHERE A.SEQ = '201907001'     
AND A.SABUN = 'rosebay'
AND A.RESULT_MON IS NOT NULL    
AND A.CODE IN ('110','113','230')
ORDER BY A.CODE

2020. 3. 2. 18:40

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

posted by 지긋이 2020. 2. 27. 17:06

기본적이고 자주 쓰는 명령어들이지만 가끔 문법적으로 생각나지 않을 때 보기 위해 기록.

INSERT INTO 테이블 추가
INSERT INTO 테이블명 (AA,BB,CC) --컬럼명1,컬럼명2,컬럼명3
           VALUES(aa,bb,cc);

ALTER 컬럼 추가
ALTER TABLE 테이블 이름 ADD (컬럼명 타입);
ALTER 컬럼 구조 변경
ALTER TABLE 테이블 이름 MODIFY (컬럼명 타입);

CONSTRAINT 제약조건의 생성

CONSTRAINT 제약조건의 재생성
1) PK 키를 삭제 후 다시 생성 ! 스키마(접속시)명 생략 가능
- 삭제 : ALTER TABLE 스키마명.테이블명
   DROP CONSTRAINT SYS_C00626892; --기존PK KEY 명칭
- 추가1) : 시스템 랜덤이름으로 추가
ALTER TABLE 스키마명.테이블명
-- ADD CONSTRAINT PK명 PRIMARY KEY
   ADD ( PRIMARY KEY
  (ENTER_CD, YYYY, HALF_CD, BRANCH_CD)); --컬럼명1,컬럼명2,컬럼명3,컬럼명4
- 추가2) : 본인이 정한 PK별칭으로 추가
ALTER TABLE 테이블명
ADD CONSTRAINT 별칭_PK PRIMARY KEY (HOUSE_CODE, CONT_SEQ, CONT_COUNT) ;
2) NOT NULL 컬럼 추가
- ALTER TABLE 테이블명 MODIFY 컬럼명 NOT NULL;

posted by 지긋이 2020. 2. 18. 12:03

회사에서 연말정산 패치로 패치파일을 계속 넘겨주는데,
SQL문에 툴에서 '&'가 자꾸 걸린다.

이 때 사용하는 명령어를 남겨본다.

SET DEFINE OFF

SQL Developer 등에서 오류가 날 때(&으로 변수를 찾을 때 이용해 보자.)

참고
구루비 : http://www.gurubee.net/lecture/1148

posted by 지긋이 2020. 2. 14. 15:51

DB에서 제일 어려운 게 계층형 구조이다. 몇 년이 지나도 아직도 넘나 어려운 것...

오늘도 위기의 오류는 ORA-01436: CONNECT BY의 루프가 발생되었습니다.

이 문제는 오류문구에 답이 있는데 루프를 도는데 문제가 발생했다는 것으로
1) 데이터엔 문제가 없는데 쿼리에 문제가 있다.
: Connect by 절에 조인 조건 누락
2) 쿼리엔 문제가 없는데 데이터에 문제가 있다. 
: 순환되는 자료 오류

2)의 케이스인 경우 간단한 해결 방법으로는 Connect By 뒤에 NOCYCLE을 추가하는 것이다.
말 뜻 그대로 루프 사이클을 돌리지 않겠다는 건데...

제대로 고치려면 1) 쿼리 자체의 수정 혹은 2)Data의 수정이 필요하다.

특히나, 오류가 발생되는 지점을 확인하기 위해서는 CONNECT_BY_ISCYCLE을
조회하는 컬럼에 추가하여 오류 지점이면 1, 아니면 0으로 구분할 수 있으며,
WHERE CONNECT_BY_ISCYCLE = 1을 추가하여 찾아 고쳐보도록 한다.

Ex)
Select LEVEL AS _Lev
        ,Col1
        ,Col2
        ,Col3
        ,Col4
        ,CONNECT_BY_ISCYCLE
FROM (
          Select A.ColSub1
                  ,A.ColSub2
                  ,A.ColSub3
                  ,A.ColSub4
           From Ttest1 A, Ttest2 B
           Where A.ColSub1 = B.ColSub1
            ...
           Group By ColSub1, ColSub2, ColSub3, ColSub4
           ) A
Start With A.Col1 IS NULL
Connet By NOCYCLE PRIOR A.Col2 = A.Col3 --Join 조건

필자의 경우 A.Col2 = A.Col3 데이터가 동일하여 계층 구조를 만드는데 오류가 발생되었음

주저리주저리... 부모를 의미하는 Col3와 Col2 데이터가 동일 = 자기자신을 가르킨 형태..
운영 데이터랑 테스트 데이터가 일치하지 않는데다가 오류 메시지도 데이터 세팅 모두 끝낸 상태에서 쿼리를 조회하니 그때서야 오류가 나와서 하아...

참고
구루비 : http://www.gurubee.net/article/60617 오류 케이스 찾는 방법 설명

계층쿼리 실행 순서
Start With => Connect By => Where

posted by 지긋이 2020. 2. 7. 09:56

왜인지... 한국의 개발자(다른나라도?)에게 OS쪽은 개발 관련 영역으로 자주 접하게 되는 것 같다.
패키지 솔루션 쪽으로 일을 하게 되면서 OS를 건들지 않을거라 생각했지만? 아니었다. ㅋ

자주 사용하고 있는 명령어. 기록차 적어둔다.

ls(조회) : 디렉토리 내용을 조회한다.(윈도우의 CMD 커멘드창의 dir과 같은 명령어)
- 기본형 : ls =>현재 디렉토리의 내용을 조회한다. ex) 폴더 이름, 파일 이름 등
- 응용형 : 각종 옵션을 통해 보다 자세하게 조회가 가능하다. 조합하여 사용도 가능
1) -a(all) : 숨겨진 파일이나 디렉토리를 조회한다.
2) -l(long) : 자세한(detail) 내용을 조회한다. ex) 권한, 소유자, 그룹, 파일크기, 수정일자/시간 등
3) -s(size) : 파일 크기 순으로 정렬하여 조회한다.
4) -r(reverse) : 거꾸로(기본형 알파벳 순) 조회한다.
5) -R(recursive) : 하위 디렉토리까지 조회한다.

응용
ls -al(숨겨진 파일까지 자세하게 조회한다.)
ls -alrh

6) -h(human) : K, M, G 단위를 사용하여 파일크기를 사람이 보기 좋게(?) 편하게(?) 조회한다.
7) -u : 접근시간(access time)을 조회한다.
8) -c : 변경시간을 조회한다.

응용
ls -lu
ls -aSrlh(숨겨진 파일을 포함하여 파일크기역순으로 자세히 보기 좋게 조회한다.)
ls a*.v => 유닉스에서도 와일드카드를 이용하여 특정문자를 포함하여 조회가 가능하다.
: a로 시작하고 .v로 끝나는 내용을 조회한다.

mv(이동) : 파일 혹은 디렉토리를 이동시킨다(복사x 잘라내기->붙여넣기ok)
- 기본형
1) mv 파일이름 디렉토리명 =>현재 디렉토리의 파일을 디렉토리로 이동시킨다.
ex) 폴더 이름, 파일 이름 등
2) mv 파일이름1 파일이름2 => 파일이름1을 파일이름2로 변경한다.
- 응용형
1) mv 파일이름1 파일이름2 디렉토리명1 =>현재 디렉토리의 파일1,2를 디렉토리명1로 이동시킨다. 

'IT(job) > OS' 카테고리의 다른 글

[UNIX/LINUX] VI편집기 기본 사용법 정리(작성중)  (0) 2020.10.12
posted by 지긋이 2020. 2. 6. 11:20

참 난감한 일이다. 윈도우7에서 10으로 업그레이드 하면서 IE버전도 다 올라갔는데...
기존의 사이트 이용중 번거롭게 사용되는 일부 기능(?)오류가 생겼다.
그 중 대표적인게 팝업 뜬 후 함께 뜨는 빈 화면 팝업!
이걸 없앨 수 있는 방법을 여러가지 찾아봤는데 가장 좋은건 역시 호환성보기 설정에 URL(IP)을 추가
: ie 옵션 중 도구 > 호환성 보기 설정 > 이 웹 사이트 추가 에 해당 사이트IP 추가

고객사에도 설명을 했으나.. 역시나 모든 사용자에게 번거롭다라고 하여 설정을 강제로 변경할 것을 찾아보았다.
사이트 접속을 하면 강제적으로 호환성 보기 설정을 걸어버리는 것도 있으면 참 좋으련만 그건 없는듯?
(구글링에서는 찾지 못함. 아시는 분은 좀 알려주세요.)

ie 버전 강제 변경 처리
공통 영역 스크립트 단에 강제로 버전을 변경하는 것을 걸어버리는 방법이 가장 간단한 듯하다.
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>

버전별 확인
IE7: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1;...)
IE8: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0;...)
IE8 Compatibility View: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/4.0;...)
IE9: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)
IE9 Compatibility View: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/5.0;...)

Agent 확인
var agentStr = navigator.userAgent;
        var mode;
        if (agentStr.indexOf("Trident/5.0") > -1) {
            if (agentStr.indexOf("MSIE 7.0") > -1)
                mode = "IE9 Compatibility View";
            else
                mode = "IE9";
        }
        else if (agentStr.indexOf("Trident/4.0") > -1) {
            if (agentStr.indexOf("MSIE 7.0") > -1)
                mode = "IE8 Compatibility View";
            else
                mode = "IE8";
        }
        else
            mode = "IE7";

        document.title = "Browser Mode:\t" + mode;
        //document.write(navigator.userAgent);

! 참고
https://social.msdn.microsoft.com/Forums/vstudio/en-US/ae715fd2-1ddd-46f7-8c26-9aed6b2103f1/how-to-detect-compatibility-mode-in-ie-any-version?forum=netfxjscript

posted by 지긋이 2020. 1. 14. 16:02

오늘 기준일이 2020.02.17일이라고 할 때

var _today1 = new Date();
var _today2 = new Date();
var firDay, lasDay;

_today1 = new Date(_today1.getFullYear(), _today1.getMonth()-5,1); //6개월전(해당월 포함)

firDay = dayFormatChk(_today1, 1); //6개월전 Format 변경
lasDay = dayFormatChk(_today2, 2); //sysdate 말일

$("#sFromYmd").val(firDay);
$("#sToYmd").val(lasDay);

console.log("todayFormat::"+firDay+"\n"+lasDay);
=> 출력

todayFormat::2019-09-01
2020-02-29

function dayFormatChk(_today, type){
var day;
if(type==1){//현재 6개월 전 구하기
day = _today.getFullYear()+"-"+("0"+(_today.getMonth()+1)).slice(-2)+"-"
+("0"+(_today.getDate())).slice(-2); 

}else if(type==2){ //현재 말일 구하기
day = new Date(_today.getFullYear(), _today.getMonth()+1,0);

day = _today.getFullYear()+"-"+("0"+(day.getMonth()+1)).slice(-2)+"-"
+("0"+(day.getDate())).slice(-2);
}
return day;

}

posted by 지긋이 2019. 12. 19. 11:38

IBsheet(ver 7.x기준)가 초기 로딩될 때 설정은 기본 가이드를 따른다.
여기에서 자주 쓰는 기능을 적어본다.

기본 형태

1. Cfg
{SearchMode:smLazyLoad,Page:50,MergeSheet:msHeaderOnly};

2. HeaderMode
- Cols 앞에 쓰기도 하고 뒤에 쓰기도 한다.
var info = {Sort:1, ColMove:1, ColResize:0, HeaderCheck:0};

Header 클릭시 Sort 가능 여부, True/false로도 대체 가능
Header Column 이동 가능 여부, True/false로도 대체 가능
Header Column의 Width Resize 가능 여부, True/false로도 대체 가능

Header CheckBox 타입일 경우 전체 CheckBox(일괄 선택) 표시 가능 여부, True/false로도 대체 가능

3. Cols : 헤더에 들어갈 타이틀과 헤더기능을 지정한다.
{Header:"결재여부|결재여부",Type:"CheckBox",Width:80,SaveName:"A",ColMerge:0,Align:"Center"},
결재여부|결재여부 : 헤더 타이틀 Text를 "|"로 연결한다.
Type:"CheckBox" : Column 타입을 결정한다.(세부내용은 3-1 참고)
SaveName:"A" : SQL에서 가져오는 컬럼명을 말하며, 카멜케이스 형식으로 연결한다.
ex) SQL TEST_ABC => SaveName:"testAbc"

var headers = [
{Header:"
결재여부|결재여부",Type:"CheckBox",Width:80,SaveName:"A",ColMerge:0},
{Header:"신청인|신청인",Type:"Text",Width:80,ColMerge:1},
{Header:"신청일자|신청일자",Type:"Date",Width:100,Format:"Ymd"},
{Header:"신청금액|신청금액",Type:"AutoSum",Width:85,SaveName:"B",Format:"Integer"},
{Header:"기간|시작일",Type:"Date",Width:100,SaveName:"C",Format:"Ymd",ColMerge:0},
{Header:"기간|종료일",Type:"Date",Width:100,SaveName:"D",Format:"Ymd",ColMerge:0},
{Header:"시간|시작",Type:"Date",Width:100,Format:"Hm",ColMerge:1,Align:"Center"},
{Header:"시간|종료",Type:"Date",Width:100,Format:"Hm",ColMerge:1,Align:"Center"}
];

mySheet.InitHeaders(headers,info);

3-1. Type

3-2. Format
기본형은 Format:""이다.

유형 설명
Integer(NullInteger) 정수 형태, 기본 0(기본 Null)
Float(NullFloat) 실수 형태, 기본 0(기본 Null)
Ymd 년월일
Ym/Md 년월/월일
Hm/Hms 시분/시분초
YmdHms/YmdHm 년월일시분초/년월일시분
Number 숫자 형태 (특정 포맷없이 숫자키만 입력 받는 형태)

- 숫자 : #
해당위치에 값이 있는 경우 해당 값을 표시하고, 없는 경우는 빈값으로 표시한다. 소수점 이하에서 사용하는 경우는 표시할 자리수를 결정하며 입력된 값의 자리수가 #의 개수보다 많은 경우 반올림하여 개수만큼 표시한다.

Input= 12345.678, Format=#,###.##,Output=12,345.68
Input= 0.789  Format=#,###.##,Output=.79
- 숫자 : 0
해당위치에 값이 있는 경우 해당 값을 표시하고, 없는 경우는 0으로 표시한다. 소수점 이하에서 "#"과 동일하게 동작한다.
)
Input=123456.7  Format=#,##0.00  Result=123,456.70
Input= 0.7  Format=#,##0.00  Result=0.70
- 
소수점 : .
소수점이 있는 경우 실수표현이 가능하며 소수점을 표현하는 경우 ibmsg SYS_DecimalSeparator에 설정되어 있는 값으로 표현된다.
- 천단위구분자 : ,
천단위 구분자를 넣은 경우 천단위 마다 구분자를 표시하며 ibmsg SYS_GroupSeparator에 설정되어 있는 값으로 표현된다. 또한, 소수점 바로 앞에 사용하는 경우는 콤마 개수만큼 1000으로 나눈 값으로 표현한다.
)
Input= 123456.789  Format=0,.00  Result=123.46
Input= 123456.789  Format=0,,.00  Result=0.12
- 퍼센트 : \\%
마지막에 퍼센트 기호를 넣는 경우 자동으로 %를 표현한다.
)
Input=123.456 Format=#,##0.00\\%  Result=123.46%
- 문자 : # 또는 *
해당위치에 값이 있는 경우 해당 값을 표시하고, 없는 경우는 빈값으로 표시한다.
)
Input=7907211022553
=> Format=######-****, Result=790721-****553

이 내용은 아이비시트에서 제공하는 개발자가이드+실제적용 경험에 의해 기재한 글입니다.

posted by 지긋이 2019. 12. 17. 09:36

자주 사용하는 명령어지만 가끔 까먹을 때가 있어 기록차 남겨둔다.

1. 드라이브 이동 : 현재 드라이브가 C인데 D드라이브로 이동하고 싶다면?
C:\>D:

2. 폴더 경로 이동 : 현재 드라이브의 특정 폴더로 이동하고 싶다면?
C:\>cd eclipse
C:\eclipse>cd configuration
C:\eclipse\configuration>

3. 화면 정리(클리어)
C:\>cls