BLANK, NULL AND BLACK

자바스크립트 지식이 없는 관계로 노가다 코딩 일 듯 하다.

비효율적이고, 주먹구구식이지만 어쩔 수 없다. 허허허


사내시스템 메인화면에서 배너형식으로 이미지 몇개를 돌게해서 직원들에게 보여주고 있다.

요약된 정보를 작은 이미지에서 보여주고 (실제 5초마다 바뀌는 이미지)

관심 있는 이미지를 클릭하면 큰 이미지로 그 내용을 상세하게 보여주는 .... 그런 형식이다.

이미지는 디자이너가 만드니까 신경 쓸게 아니다만,


1. 요약된 정보 이미지

2. 요약된 정보 이미지 클릭 시 큰 이미지를 새창에 띄워서 전체 내용 보여줌.

3. 큰 이미지, 그러니까 전체 내용이 있을 수도 있고, 없을 수도 있음.


3번이 좀 맘에 걸렸다.

1번부터 10번까지 이미지가 있다면, 1~5번은 큰 이미지가 없고 나머지는 있고 이런식도 아니였다.

1,2,5,8 큰 이미지 없음. 나머지 큰 이미지 있음. 뭐 이런식..

언제나 예외와 싸우는게 프로그래밍이라 하지만 짜증이 안날래야 안날 수가 없다.


그래서 만들었는데,,

다시 처음부터 만들라면 할 수 있을지 모르겠다.

완성도도 떨어지고.. 아무튼 그렇다. 허허헣~


대략적인 구조는

1. 파일이름이 제각각 일 수 있으니 폴더에 있는 이미지 파일이름을 먼저 배열에 넣는다.

2. 파일 이름앞에 '파일경로', 파일이름 뒤에 '확장자' 를 붙여서 이미지 주소를 완성 시킨다.

3. 큰 이미지를 가지는, 다시 말해 클릭 했을 때 크게 보여줄 이미지를 가지고 있는 파일이름을 특정 함수 파라미터에 넣는다.

3-1. 특정 함수에 파일이름이 적힌 이미지는 클릭 시 새창으로 큰 이미지 표시, 나머지는 표시안함.

4. setInterval() 과 setAttribute() 를 이용해서 이미지를 지정된 시간 만큼 보여주고 이미지 교체 (현재는 5초)


소스를 다 적긴 좀 거시기 하니까 첨부파일로 올려놔야겠다.

이미지는 사내에서 사용하는 이미지가 아닌, 사이즈만 같은, 동물 이미지로 교체.


이미지에 대해서 간략히 설명한다면

파일이름은 "00","01".. 이런식의 숫자로 돼있다.

어차피 파일이름을 배열에 직접 넣어주니까 추후에 수정이 가능하다.

작은 이미지를 클릭 했을때 띄워질 큰 이미지는 파일 이름은 같지만 뒤에 알파벳 "L" 을 붙였다. 라지의 첫글자.

이 부분 또한 맘대로 바꿀 수 있다. 소스랑 매칭만 시켜주면 뭐....... (예: 00.jpg, 00L.jpg, 01.jpg, 01L.jpg.....)


일단 올려보자.

틈틈히 소스를 보면서 수정도 하고 해야하는데

잘 돌아간다면 그냥 그런가 보다 하니까 잘 안봐진다. 에휴.. 맨날 그 밥에 그 나물..


Rolling.zip



'JAVASCRIPT' 카테고리의 다른 글

Object  (0) 2016.08.18
window.opener  (0) 2016.08.18
Div 를 새창 팝업으로 띄우기  (0) 2016.07.01
setInterval(), setTimeout()  (0) 2016.06.02

우후! 자바스크립트 첫 글이다.


이상하게 빡세다. 될듯 한데, 안되고, 안되겠지 했는데 결과가 나온다! ㅡ_ㅡ

확실히 제이쿼리가 편하긴 하다는걸 느낀다.

VS만 만지다가 sublime 에서 작업을 해보니 여간 갑갑한게 아니다.

오류도 안띄워주고, 되면 된다. 안되면 안된다 말이 없으니.. 크롬 없었으면 어찌했을꼬~


일단은 자주 쓸 일은 없지만

사내시스템 메인화면에서 이미지 몇장을 돌리면서 직원들이 보게 해달라는 요청이 있기 때문에

찾아본거 까먹지 않도록 적어본다.


우선 참고 했던 블로그주소 : http://stove99.tistory.com/56


보고 있지만, 인터벌과 타임아웃의 정확한 차이를 모르겠다.

아직 다른점이 뭔지 정확히 안찾아봤으니 찾으면 나오겠지.


setInterval('함수()', 시간)


저 함수 부분을 왜 문자열처럼(따옴표로 감싸서) 적어야 할까?!

따옴표 안붙였다가 한참 찾았다. 어찌보면 이 포스트는 '저 함수부분이 문자열' 이라는 것을 까먹지 않기 위해 작성하는 것이다!!

시간 부분을 0.1초 정도로 줄여보니 유흥가에서 많이 보던 간판이 생각나서 얼른 다시 원래대로 돌렸다.... (으흠..)


잘되면 재밌는데, 잘 안되면 지독하게 안된다.

'JAVASCRIPT' 카테고리의 다른 글

Object  (0) 2016.08.18
window.opener  (0) 2016.08.18
Div 를 새창 팝업으로 띄우기  (0) 2016.07.01
자동 롤링 이미지  (0) 2016.06.02

앞의 피벗 기능을 활용한 데이터 뽑기의 진화버전(?) 이다.


잠깐 다시 설명해 보자면

정상적인 회사라면 급여지급 정보는 매달 반복될것이고, 직원들 사번(또는 고유 아이디) 또한 매번 반복될 것이다.

그렇다면 자료 요청자가 급여지급 월의 범위를 지정해서 자료요청을 할텐데

그 범위가 이전달 또는 최근 2개월 정도 일수도 있지만

2014년 전체의 정보를 보고싶다던가 (그나마 다행)

2014년 3월 부터 2015년 6월 까지의 데이터를 보여달라는 등의 희한한 요구도 있을 수 있겠다.


그러면 앞의 방법에서는 요청한 급여지급월을 하나씩 SELECT 문에 적어줘야 했었다. (생각만 해도.... )

물론 엑셀이나 기타 프로그램을 이용하여 자동완성 기능을 사용하면 생각보다 시간이 절약되기도 한다.

하지만 목마른 사람이 우물을 파듯이 불편하면 만들어야지 뭐~.



우선 예를 들어 위에서 나온 2014년 3월 부터 2015년 6월 까지의 데이터를 요청 받았다 라고 해보자.

[2014-03], [2014-04], [2014-05], [2014-06] ........ [2015-06] 

급여정보는 위와 같은 식으로 데이터가 나와야 되겠고, 제일 앞에는 사번과, 이름 정도가 나오면 알아보기 쉽겠다.

사번, 이름, [2014-03], [2014-04], [2014-05], [2014-06] ........ [2015-06] 


여기서 생각해야 될 것이 직원이 50명이라면 

2014년 3월에 50명의 급여정보

2014년 4월에 50명의 급여정보.... 처럼 매월*50명의 데이터가 나오게 된다.

같은 [연도-월] 정보가 50개씩 나오니 비효율적이다.


변수를 하나 만들어서 중복되지 않는 데이터만 넣어놓자.


DECLARE @MONTH VARCHAR(MAX) SET @MONTH = ''

SELECT

    @MONTH = @MONTH + A.지급월

FROM

    (

        SELECT

            DISTINCT '[' + 지급월 + '], ' AS 지급월

        FROM

            PAYMENT_TBL

        WHERE

            지급월 BETWEEN '2014-03' AND '2015-06'

    ) A

ORDER BY

    A.지급월


"[ ]" 괄호와 괄호 뒤에 붙어 있는 "," 콤마, ORDER BY(지급월 순서) 는 추후 @MONTH 변수의 내용을 컬럼이름으로 활용하기 위한 방법이다.

SELECT @MONTH 를 해보면 문자열 형태로 쭉 붙어서 들어갔다.


이제 실제로 데이터를 출력할 쿼리를 만들어보자.

변수를 하나 더 만들어서 그 안에 문자열 형태로 쿼리문을 조합하고, EXEC로 실행 시킬 것이다.


DECLARE @SQL VARCHAR(MAX) 

SET @SQL = '

                      SELECT

                          사번, 이름, '

                          + LEFT(@MONTH, LEN(@MONTH)-1) + '

                      FROM

                           (

                               SELECT

                                   사번, 이름, 지급월, 금액

                               FROM

                                   PAYMENT_TBL

                           ) A

                      PIVOT

                          (

                              SUM(금액)

                              FOR 지급월 IN (' + LEFT(@MONTH, LEN(@MONTH)-1) + '

                          ) B

                  '

EXEC (@SQL)


이러하다.

기본적으로 MSSQL의 PIVOT 의 문법을 따르며, 자료요청 시 마다 달라질 수 있는 지급월 정보는 변수로 처리한다.


LEFT() 함수를 사용한 이유는 @MONTH 에 들어있는 데이터 마지막에 "," 콤마가 있는 것을 알 수 있다.

마지막 콤마는 에러를 일으키기 때문에 없애줘야 하고

그 외에는...... PIVOT 이라는 낯선 키워드를 사용한거 말곤 충분히 이해할 수 있는 내용인듯 하다.


추후에는 CASE문을 사용하는 방법을 위와 같은 진화된 방법으로 실습해봐야겠다.

까먹지말자.


'MS-SQL' 카테고리의 다른 글

LOG 파일 용량 줄이기  (0) 2017.08.07
'sa' 계정으로 로그인 안됨  (0) 2017.01.16
ROW ↔ COLUMN (PIVOT)  (0) 2016.04.14
계층구조 쿼리 (CTE)  (0) 2015.10.20
다수의 NULL 컬럼에 순차번호 넣기  (0) 2015.07.01

ROW ↔ COLUMN (PIVOT)

MS-SQL2016. 4. 14. 23:41

요청이 있을때만 두드리니 실력이 늘리가 있나.. 에휴;

초보티를 벗지 못하는 내가 참 밉다.


마치기 직전에 회사에서 요청이 왔는데

피벗기능을 사용해야 하는 요청이었다.


회사의 정보를 여기서 공개 할 순 없고, 

비슷한 가상의 테이블을 만들어서 실습해보자.


까먹지 말자!!!


시나리오) 그동안 회사 직원들에게 지급했던 급여를 살펴보려 한다.


테이블명: PAYMENT_TBL

컬럼명: 사번, 급여지급월(연도-월), 금액


예시) 

 사번

지급월 

금액 

1111

2016-01

100

1112

2016-01

120

1113

2016-01

110

1114

2016-01

100

 1111

2015-12

90

 1111

2015-11

100

 1113

2015-12

120 

 1115

2015-12

200

 1115

2015-10

200

 1115

2015-09

200


세로로 나열돼 있는 데이터를 가로로 나열하기 위한 실습이므로, 데이터의 순서와 급여액수 등의 문제는 그냥 넘어간다. (대충 입력...)


원하는 모양) 

 사번

2016-01 

2015-12 

2015-11 

2015-10 

2015-09 

2015-08 

2015-07 

1111

100

90

100

0

0

0

0

1112

120

0

0

0

0

0

0

1113

110

120

0

0

0

0

0



방법1)

SUM() 과 CASE 문을 사용하여 원하는 모양을 만들어보자.


SELECT 

사번

, 이름

, SUM(CASE 지급월 WHEN '2015-11' THEN 금액 ELSE 0 END) AS [2015-11]

, SUM(CASE 지급월 WHEN '2015-12' THEN 금액 ELSE 0 END) AS [2015-12]

, SUM(CASE 지급월 WHEN '2016-01' THEN 금액 ELSE 0 END) AS [2016-01]

        ..... 바로 위 3줄 처럼 가로로 배열 시키고자 하는 컬럼을 같은 형식으로 만든다.

FROM

PAYMENT_TBL

GROUP BY

사번, 이름

ORDER BY

사번



위와 같이 하면 원하는 모양대로 결과가 나오긴 하지만, 보고 싶어 하는 컬럼을 위와 같이 하나하나 만들어줘야 한다.

예시에서는 몇개 되지 않는 데이터지만, 10년이 넘는 장수 기업에 직원이 300명 가량이라고 생각해보자.

현직원만 300명정도 이고, 퇴사자를 포함하면 더 많은 인원수 일것이다.

이미 퇴사한 사람의 급여 내역을 뭐하러 보냐 라고 하면 할 말은 없지만, 

각 데이터를 DB 에 저장하는 이유가 필요할때 보기 위해서 저장하는 것이니 상황을 완전 배제하진 말자.


설명)

고정이 될 컬럼을 지정하고(사번, 이름), 

그 다음 순서 부터는 컬럼명이 급여의 지급월이 되고, 컬럼의 내용은 금액이 표시되도록 한다.

지급월이 '2015-11' 이면 금액 더하기 한다라고 풀이 할 수 있겠다.

두번째 세번째도 마찬가지로 

지정된 지급월이 맞으면 해당 금액을 SUM() 한다. 

그럴리는 잘 없지만 한달에 두번 급여를 받았다면 두번의 급여가 합산되서 표시 되겠지?

SUM을 사용했으니 GROUP BY 로 묶어주자.


원리를 알면 그리 어렵지 않은데, 백지상태에서는 쉽사리 생각나지 않는다.

에휴....


다음은 MSSQL 에서 제공하는 PIVOT(피벗) 쿼리를 사용해보자.


방법2)

방법1) 과 비슷하지만 조금 다르다.


SELECT

사번

, 이름

  , [2015-11]

  , [2015-12]

  , [2016-01]

  ..... 바로 위 3줄 처럼 가로로 배열 시키고자 하는 컬럼을 같은 형식으로 만든다.

FROM

(

        SELECT

            사번

            , 이름

            , 금액

            , 지급월

        FROM

            PAYMENT_TBL

) A

PIVOT

    (

        SUM(금액)

        FOR 지급월 IN ([2015-11], [2015-12], [2016-01] ..... 위에 지정한 컬럼을 그대로 적어주자.)

    ) B



설명)

먼저 SELECT로 외형을 잡아주자(?)

사번과 이름 그 다음 각 지급월을 컬럼명으로 하고, 컬럼 내용은 금액이 들어가겠지?

제일 상단의 외형을 만드는 SELECT 에서 사용할 컬럼을 모두 여기에 적어줘야 한다. (어찌보면 당연하네..)

그리고 PIVOT 이라는 키워드를 사용해서 위에서 SELECT 한 테이블을 돌려버리는 듯 하다(?)

(이렇게 사용하니까 되긴 된다만, 완벽하게 이해가 가지 않는다. 좀 더 찾아봐야 할 듯 하다.)


아직 생소한 부분이 있다.

FOR 라는 키워드와 PIVOT,

FOR 뒤에 나오는 컬럼명과 IN 뒤에 나열되는 컬럼들 과의 관계 등등

좀 더 찾아봐야겠다.




참고: http://lab.cliel.com/entry/SQL-%ED%94%BC%EB%B2%97Pivot%EA%B3%BC-%EC%96%B8%ED%94%BC%EB%B2%97UnPivot

'MS-SQL' 카테고리의 다른 글

'sa' 계정으로 로그인 안됨  (0) 2017.01.16
ROW ↔ COLUMN (PIVOT) - 두번째  (0) 2016.04.21
계층구조 쿼리 (CTE)  (0) 2015.10.20
다수의 NULL 컬럼에 순차번호 넣기  (0) 2015.07.01
MS-SQL 메모리 점유율  (0) 2015.05.15

타 회사의 데이터를 받아서 회사 DB에 넣을 일이 있는데

언젠가 부터 CSV 파일을 여러개로 나눠서 보내준다.

메일의 용량 제한 때문이라고는 하지만 ...

개당 9메가가 조금 넘는 CSV 파일 10개가 넘게 오곤 한다.


엑셀 파일로 만들기 위해 파일을 하나씩 열어서 복붙하다보면

이게 뭐하는 짓인가 싶기도 하고

하는 중에 전화가 오거나 잠시 자리를 비우고 다시 오면 어디까지 했는지 햇갈릴 때도 있다.


찾아봤다. [CSV 파일 합치기]

왜 그동안 이런 소모적인 행동을 해야했는지 모르겠다.

검색하니 바로 튀어나온다.


옛 말 중에 머리가 나쁘면 손 발이 고생한다는 말이 딱 맞는 상황이다.


참고 : http://blog.naver.com/PostView.nhn?blogId=agney&logNo=60135842491


별도의 프로그램을 사용하는 것도 아니고

간단한 도스 명령으로 가능하다.


시작 > 실행 > CMD

CSV 파일이 있는 폴더로 이동 후

type *.csv > 합쳐질파일이름.csv


[한가지 참고사항]

파일이 여러개이고 순서대로 저장을 해야한다면 파일 이름에 번호를 붙여주자.

한자리 숫자에는 앞에 '0' 을 붙여야 원하는 순서대로 작업을 진행한다.

예)

전: 나뉜파일1.csv, 나뉜파일2.csv나뉜파일3.csv ... 나뉜파일10.csv

후: 나뉜파일01.csv, 나뉜파일02.csv, 나뉜파일03.csv, 나뉜파일04.csv ... 나뉜파일10.csv

'WINDOWS' 카테고리의 다른 글

엑셀 빈칸 채우기  (0) 2016.06.14