달력

62017  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

//현재 날짜가 몇주차인지.
1.SELECT (DAY(convert(varchar(10),getdate(),120)) + (DATEPART(dw, DATEADD (MONTH, DATEDIFF (MONTH, 0,convert(varchar(10),getdate(),120)), 0)) -1)-1)/7 + 1

 

2.SELECT DATEDIFF(week, DATEADD(MONTH, DATEDIFF(MONTH, 0, convert(varchar(10),getdate(),120)), 0),convert(varchar(10),getdate(),120)) +1;

 

EX) 달력상 2010-09-13일은 두번째주가 아니라 세번째주로 갖고온다.

      특정 날짜형식 'YYYY-MM-DD' 을 넣고 싶으면 convert(varchar(10),getdate(),120) 이 부분만    값 다르게 넣으면 됨.

결과

3

 

참고로 오라클에서 2010-09-13 일을 TO_CHAR(SYSDATE,'W') 이런식으로 갖고오면 13일을 두번째 주로 인식함.

 

 

//현재 날짜가 무슨 요일인지

select datepart(dw,convert(varchar(10),getdate(),120))

결과

0:일요일 1:월요일....


Posted by 한설림
|

select to_char(sysdate, 'day') from dual --결과 : 화요일 ; select to_char(sysdate, 'dy') from dual --결과 : 화 ; select to_char(sysdate, 'd') from dual --결과 : 3 (1:일, 2:월, 3:화, 4:수, 5:목, 6:금, 7:토)

;



Posted by 한설림
|

SELECT  (CASE 

           WHEN DATEPART(dw , regdate) = 1 THEN '일'

WHEN DATEPART(dw , regdate) = 2 THEN '월'

WHEN DATEPART(dw , regdate) = 3 THEN '화'

WHEN DATEPART(dw , regdate) = 4 THEN '수'

WHEN DATEPART(dw , regdate) = 5 THEN '목'

WHEN DATEPART(dw , regdate) = 6 THEN '금'

WHEN DATEPART(dw , regdate) = 7 THEN '토'

END ) AS Week

FROM (

SELECT '2017-06-18'  as regdate

)AA

'DBMS > MSSQL' 카테고리의 다른 글

MSSQL SPLIT 구현  (0) 2017.07.24
MSSQL 중복 데이터 삭제  (0) 2017.07.24
MSSQL PIOVT  (0) 2017.07.05
MSSQL MERGE / IF NOT EXISTS 문 사용법  (0) 2017.06.07
MSSQL 금액에 콤마표시하기  (0) 2017.05.25
Posted by 한설림
|

DISTINCT 와 GROUP BY의 차이

DISTINCT는 주로 UNIQUE한 컬럼이나 튜플(레코드)을 조회하는 경우 사용되며,
GROUP BY는 데이터를 그룹핑해서 그 결과를 가져오는 경우 사용되는 쿼리 형태이다.


하지만 두 작업은 조금만 생각해보면 동일한 형태의 작업이라는 것을 쉽게 알 수 있으며,
일부 작업의 경우 DISTINCT로 동시에 GROUP BY로도 처리될 수 있는 쿼리들이 있다.
그래서 DISTINCT를 사용해야 할지, GROUP BY를 사용해서 데이터를 조회하는 것이 
좋을지 고민되는 경우들이 가끔 있다.


간단하게 아래 예를 살펴 보자
1. SELECT DISTINCT fd1 FROM tab;
2. SELECT DISTINCT fd1, fd2 FROM tab;


위의 두개 쿼리는 간단히 GROUP BY로 바꿔서 실행할 수 있다.
1. SELECT fd1 FROM tab GROUP BY fd1;
2. SELECT fd1, fd2 FROM tab GROUP BY fd1, fd2;


그렇다면 이 예제의 쿼리에서 DISTINCT와 GROUP BY 는 어떤 부분이 다를까 ?
사실 이런 형태의 DISTINCT는 내부적으로 GROUP BY와 동일한 코드를 사용한다.
즉, 동일한 처리를 하게 된다는 것이다. 


하지만 더 중요한 차이가 있다.
DISTINCT의 결과를 정렬된 결과가 아니지만, GROUP BY는 정렬된 결과를 보내준다.
GROUP BY의 작업을 크게 "그룹핑" + "정렬"로 나누어서 본다면, DISTINCT는 "그룹핑" 작업만
수행하고 "정렬" 작업은 수행하지 않는 것이다.
그런데, 여기서 "정렬"은 "그룹핑" 과정의 산물이 아닌 부가적인 작업이다.


최종적으로, 이 예제의 DISTINCT와 GROUP BY는 일부 작업은 동일하지만 GROUP BY는
"정렬"을 하기 위한 부가적인 작업을 더 하게 된다.


만약 "정렬"이 필요하지 않다면 DISTINCT를 사용하는 것이 성능상 더 빠르다고 볼 수 있다.
하지만, GROUP BY를 사용하는 경우에는 정렬을 하지 않도록 유도할 수 있다.
(자세한 내용은 "GROUP BY의 Filesort 작업 제거"를 참조)




참고로
GROUP BY와 DISTINCT는 각자 고유의 기능이 있다.


DISTINCT로만 가능한 기능
1. SELECT COUNT(DISTINCT fd1) FROM tab;
    -- // 이런 형태의 쿼리는 서브 쿼리를 사용하지 않으면 GROUP BY로는 작성하기 어렵다.


GROUP BY로만 가능한 기능
1. SELECT fd1, MIN(fd2), MAX(fd2) FROM tab GROUP BY fd1;
    -- // 이렇게 집합함수(Aggregation)가 필요한 경우에는 GROUP BY를 사용해야 한다.




<<주의사항>>
가끔 어떤 사용자는 DISTINCT가 마치 함수인 것처럼 (괄호를 사용하여) 아래와 같이 사용을 하는데
만약 fd1 컬럼은 unique 값, fd2는 전체 값을 원한다면 절대 그 결과를 얻을 수 없다.


SELECT DISTINCT(fd1), fd2 FROM tab;

SELECT 문장에 DISTINCT라는 키워드가 있으면, MySQL은 SELECT되는 모든 컬럼(튜플)들에 대해서 DISTINCT를 적용해서 결과를 보내주게 된다.
위와 같은 요건을 처리하기 위해서도 아래와 같이 GROUP BY로만 해결할 수 있다.

SELECT fd1, fd2 FROM tab GROUP BY fd1;


Posted by 한설림
|

IF NOT EXISTS (SELECT * 

                 FROM hsscm_ocp.dbo.mpi_workorder 

WHERE PLANT = '@@plant'

      AND MATERIAL = '@@material'

      AND INPUT_DATE = '@@inputDate'

      AND OUTPUT_DATE = '@@outputDate')

  INSERT INTO hsscm_ocp.dbo.mpi_workorder (

PLANT

,MATERIAL

,INPUT_DATE

,OUTPUT_DATE

,QTY

,OPERATION

,RESOURCE

,ORDER_NO

,ORDER_DIV

,REMARK

,CREATE_ID

,CREATE_DATE

)VALUES(

'@@plant'

,'@@material'

,'@@inputDate'

,'@@outputDate'

, @@qty

,'@@operation'

,'@@resource'

,'@@orderNo'

,'@@orderDiv'

,'@@remark'

,'@@createId'

,getdate()

);

ELSE 

   UPDATE hsscm_ocp.dbo.mpi_workorder

      SET REMARK = '';



MERGE hsscm_ocp.dbo.mpi_workorder T1

      USING (VALUES(1)) AS Source (Number)

 ON  T1.PLANT = '1140'

      AND T1.MATERIAL = '10000003'

      AND T1.INPUT_DATE = '2016-12-23'

      AND T1.OUTPUT_DATE = '2016-12-23'

   WHEN MATCHED THEN 

     UPDATE 

SET  T1.REMARK = ''

   WHEN NOT MATCHED THEN

     INSERT   (

PLANT

,MATERIAL

,INPUT_DATE

,OUTPUT_DATE

,QTY

,OPERATION

,RESOURCE

,ORDER_NO

,ORDER_DIV

,REMARK

,CREATE_ID

,CREATE_DATE

)VALUES(

'1140'

,'10000003'

,'2016-12-23'

,'2016-12-23'

,'' 

,''

,'S311'

,'000010044747'

,'S'

,''

,'sysadmin'

,getdate()

);



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
MERGE TB_USER AS T
USING
(
    SELECT 'aaa' AS ID, 'Name#1' AS NAME
    UNION ALL
    SELECT 'bbb' AS ID, 'Name#2' AS NAME
) AS S
ON (T.ID = S.ID)
WHEN MATCHED THEN
    UPDATE SET T.ID = S.ID,
               T.NAME = S.NAME
WHEN NOT MATCHED THEN
    INSERT (ID, NAME)
    VALUES (S.ID, S.NAME)
OUTPUT $action, Inserted.*;
cs




'DBMS > MSSQL' 카테고리의 다른 글

MSSQL SPLIT 구현  (0) 2017.07.24
MSSQL 중복 데이터 삭제  (0) 2017.07.24
MSSQL PIOVT  (0) 2017.07.05
MSSQL 날짜 , 요일로 변환하기  (0) 2017.06.15
MSSQL 금액에 콤마표시하기  (0) 2017.05.25
Posted by 한설림
|