BLANK, NULL AND BLACK

SQL CONVENTION ?!!

MS-SQL2018. 4. 23. 17:07

http://www.sqlstyle.guide/


다른 프로그램 언어들은 코딩 컨벤션이라 하여, 

소스 작성에서의 가이드 라인을 제시하는 글을 심심찮게 찾아 볼 수 있는데

이상하게 SQL 은 그런 문서가 잘 안보인다.


변수 이름을 정하는 방법과 심지어 알파벳 대소문자를 어떤 조합으로 써야 하는지 법칙을 정해놨고,

거기에 따르지 않으면 좋지 않은 소스코드로 간주,

심지어 HTML 같은 경우는, 국내 대형 포털에서 컨텐츠가 자리 잡는 위치에 따라 어떤 이름을 써야하는지 지정해주고 있다.

(전체 이름이 아닌, 접두-접미 정도로 받아들이면 될 듯)


단, 그 가이드라인을 참고하고 안하고는 개발자의 자유이며, (혹은 프로젝트 관리자의 자유)

단순히 어떤 이름인지, 적절한 알파벳 대소문자의 조합으로 사용했는지는 프로그램의 성능과는 관련이 없는 듯 하다.



지금도 계속 고민중이만,

얼마전까지 고민 하던 것이 데이터베이스의 명명규칙이다.


'이름' 자체는 데이터의 성격과 쓰임새에 따라 달라질 수 있으니 누군가가 가이드를 제시 한다는거 자체가 말이 안되고,

내가 궁금했던 내용은 다음과 같다.


1.데이터베이스 이름을 대문자로 할지, 대소문자로 섞어서 할지

2.테이블 이름을 대문자로 할지, 대소문자로 할지

3.컬럼 이름을 대문자로 할지, 대소문자로 할지

4.테이블 또는 뷰 앞이나 뒤에 접두사 또는 접미사를 붙일지

5.쿼리문 작성 시 공백의 활용


마지막 5번은 아직도 여기저기 기웃거리며 참고 하려고 하는데 일부 SQL 포맷을 제공해주는 사이트 마저도 다르게 적용 시킨다.


예)

select a.seq, a,code, a.name, a.datType, a.regdate, b.ischecked from table1 a inner join table2 b on a.code = b.code and a.datType = b.datType where a.regdate between '2018-01-01' and '2018-03-31'


위의 예시로 만든 쿼리문을 구글에서 'sql formatter' 라고 검색 후, 제일 위의 3개의 사이트에 복/붙 해서 포맷을 적용시켜 보면

결과 모양이 다르게 나오는 것을 알 수 있다.


현시점에서 상단 3개의 사이트는 다음과 같다.

http://www.dpriver.com/pp/sqlformat.htm

https://sqlformat.org

https://www.freeformatter.com/sql-formatter.html



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

Stored Procedure  (0) 2018.04.23
MS SQL Server 컬럼 이름 변경  (0) 2017.11.16
중복제거된 목록에서 항목별 TOP 1 (?)  (0) 2017.11.08
오픈소스 데이터베이스 관리 툴  (0) 2017.09.17
LOG 파일 용량 줄이기  (0) 2017.08.07

Stored Procedure

MS-SQL2018. 4. 23. 13:34

버전관리가 힘들다.

여러곳에서 사용 될때 소스 수정으로 인한 결과를 예측하기 어렵다.

담당자 변경 시 그 내용에 대한 인수인계가 어렵다.



좋다. & 안좋다.

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

SQL CONVENTION ?!!  (0) 2018.04.23
MS SQL Server 컬럼 이름 변경  (0) 2017.11.16
중복제거된 목록에서 항목별 TOP 1 (?)  (0) 2017.11.08
오픈소스 데이터베이스 관리 툴  (0) 2017.09.17
LOG 파일 용량 줄이기  (0) 2017.08.07

exec sp_rename '현재 스키마.테이블.컬럼', '변경할 이름', 'column'

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

SQL CONVENTION ?!!  (0) 2018.04.23
Stored Procedure  (0) 2018.04.23
중복제거된 목록에서 항목별 TOP 1 (?)  (0) 2017.11.08
오픈소스 데이터베이스 관리 툴  (0) 2017.09.17
LOG 파일 용량 줄이기  (0) 2017.08.07

MS-SQL 에서 중복제거는 DISTINCT 키워드로 가능하다.

MS-SQL 에서 제일 위에 있는 데이터를 보기 위해서는 TOP (숫자) 키워드로 가능하다.

(괄호안의 숫자는 상위 몇개까지 보여질지 결정하는 숫자)


[테스트 환경]

1.MS-SQL

2.1000라인의 사용자 정보 데이터(더미 데이터) (www.mockaroo.com)

3.사번, 이름, 이메일, 성별, 부서코드 등의 컬럼이 있지만, 이름과 부서코드 컬럼만 사용

4.부서코드는 D001 부터 D012 까지 코드가 있음


[목표]

각 부서코드로 조회시 제일 위에 나오는 사용자에게 팀장 권한을 주려고 함.

(말이 안되는 상황이지만, 어디까지나 임의의 데이터로하는 실습이니까..)


SELECT TOP 1 [이름] FROM [사용자테이블] WHERE [부서코드] = 'D001' UNION ALL

SELECT TOP 1 [이름] FROM [사용자테이블] WHERE [부서코드] = 'D002' UNION ALL

SELECT TOP 1 [이름] FROM [사용자테이블] WHERE [부서코드] = 'D003' UNION ALL

.....

SELECT TOP 1 [이름] FROM [사용자테이블] WHERE [부서코드] = 'D012'


보통 회사의 부서가 수백/수천개가 아니니까 이런식으로 해도 되겠지만,

뭔가 좀.. 



SELECT

     [부서].[부서코드]

    ,(SELECT TOP 1 [이름] FROM [사용자테이블] WHERE [부서코드] = [부서].[부서코드]) AS Name

FROM

    (    SELECT

             DISTINCT [부서코드]

         FROM

             [사용자테이블]    ) AS [부서]

ORDER BY

    [부서].[부서코드]



원하는대로 결과가 나왔다.

혹시 지나가다 더 좋은 방법이 있으신 분들은 알려주시기 바랍니다.

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

Stored Procedure  (0) 2018.04.23
MS SQL Server 컬럼 이름 변경  (0) 2017.11.16
오픈소스 데이터베이스 관리 툴  (0) 2017.09.17
LOG 파일 용량 줄이기  (0) 2017.08.07
'sa' 계정으로 로그인 안됨  (0) 2017.01.16

http://kimseunghyun76.tistory.com/382


원격지에 디비를 생성하고,

가벼운 디비관리 오픈소스 툴을 찾다보니 이 블로그가 나왔다.


나는 DBeaver 라는 툴을 설치해봤다.

아직은 쿼리창만 필요하니 부족함이 없다. 아직은..

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

MS SQL Server 컬럼 이름 변경  (0) 2017.11.16
중복제거된 목록에서 항목별 TOP 1 (?)  (0) 2017.11.08
LOG 파일 용량 줄이기  (0) 2017.08.07
'sa' 계정으로 로그인 안됨  (0) 2017.01.16
ROW ↔ COLUMN (PIVOT) - 두번째  (0) 2016.04.21

http://www.adminschool.net/wiki/doku.php?id=dbms:mssql:admin:logresize


로그 파일(*.ldf) 용량이 급격하게 늘어났다. 

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

중복제거된 목록에서 항목별 TOP 1 (?)  (0) 2017.11.08
오픈소스 데이터베이스 관리 툴  (0) 2017.09.17
'sa' 계정으로 로그인 안됨  (0) 2017.01.16
ROW ↔ COLUMN (PIVOT) - 두번째  (0) 2016.04.21
ROW ↔ COLUMN (PIVOT)  (0) 2016.04.14

http://wisebox.egloos.com/3259715


늘 로그인 해서 작업 하던 sql 계정이 오늘 아침 갑자리 로그인이 안된다.


내 경우는 sql server 서비스를 재시작 해줘야 원상태로 작동됨.


식겁했네.

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

오픈소스 데이터베이스 관리 툴  (0) 2017.09.17
LOG 파일 용량 줄이기  (0) 2017.08.07
ROW ↔ COLUMN (PIVOT) - 두번째  (0) 2016.04.21
ROW ↔ COLUMN (PIVOT)  (0) 2016.04.14
계층구조 쿼리 (CTE)  (0) 2015.10.20

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


잠깐 다시 설명해 보자면

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

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

그 범위가 이전달 또는 최근 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

계층구조 쿼리 (CTE)

MS-SQL2015. 10. 20. 23:04


SELECT * FROM MENUS;


WITH TREE_MENUS AS

(

SELECT 

PARENT_CD

, CODE

, NAME

, URL

, CONVERT(VARCHAR(255), CODE) AS SORT

, CONVERT(NVARCHAR(255), NAME) AS COL

, URL

FROM

MENUS

WHERE

PARENT_CD = '0'


UNION ALL


SELECT

A.PARENT_CD

, A.CODE

, A.NAME

, A.URL

, CONVERT(VARCHAR(255), B.CODE + ' > ' + A.CODE) AS SORT

, CONVERT(NVARCHAR(255), B.NAME + ' > ' + A.NAME) AS COL

, A.URL

FROM

MENUS A

INNER JOIN

TREE_MENUS B

ON A.PARENT_CD =  B.CODE

)

SELECT * FROM TREE_MENUS ORDER BY CODE




그외 비슷하지만 다른 방법

http://kokun.tistory.com/entry/MSSQL-WITH-%EC%A0%88%EA%B3%BC-CTE-2

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

ROW ↔ COLUMN (PIVOT) - 두번째  (0) 2016.04.21
ROW ↔ COLUMN (PIVOT)  (0) 2016.04.14
다수의 NULL 컬럼에 순차번호 넣기  (0) 2015.07.01
MS-SQL 메모리 점유율  (0) 2015.05.15
뽑아보자. 데이터를.  (0) 2014.12.31