달력

32024  이전 다음

  • 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
  • 31

MSSQL SPLIT 구현

DBMS/MSSQL 2017. 7. 24. 20:34

/*

SELECT * FROM [dbo].[FN_SPLIT] ('감기,콧물,어지러움,콧물기침,,가래,몸살',',')

*/

CREATE FUNCTION [dbo].[FN_SPLIT]

(

    @PARAM VARCHAR(MAX) -- 대상문자열

    , @DIV VARCHAR(1) -- 특정구분자

)

RETURNS

@RESULT TABLE

(

    [VALUE] VARCHAR(MAX)

    , [ORDER] INT

)

AS

 

BEGIN

 

 

    DECLARE @INDEX INT

    DECLARE @POS INT

    DECLARE @ORDER INT

    DECLARE @TEMP VARCHAR(MAX)

 

 

 

    SET @INDEX = 1

    SET @POS = 1

    SET @ORDER = 1

 

 

 

    WHILE @POS > 0

    BEGIN

        SET @POS = CHARINDEX(@DIV, @PARAM, @INDEX)

 

 

 

        IF @POS = 0

        BEGIN

            SET @TEMP = RIGHT(@PARAM, LEN(@PARAM) - @INDEX + 1)

        END

        ELSE

        BEGIN

            SET @TEMP = SUBSTRING(@PARAM, @INDEX, @POS - @INDEX)

        END

 

 

 

        IF LEN(@TEMP) > 0

        BEGIN

            SET @TEMP = RTRIM(LTRIM(@TEMP))

            INSERT INTO @RESULT VALUES (@TEMP, @ORDER)

        END

 

 

 

       SET @INDEX = @POS + 1

       SET @ORDER = @ORDER + 1

 

 

    END

 

RETURN

END

 

 

 

--실행결과--

SELECT * FROM [dbo].[FN_SPLIT] ('감기,콧물,어지러움,콧물기침,,가래,몸살',',')



출처: http://mdj1234.tistory.com/38 [짬타이거 화이팅!]

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

MSSQL 중복 데이터 삭제  (0) 2017.07.24
MSSQL PIOVT  (0) 2017.07.05
MSSQL 날짜 , 요일로 변환하기  (0) 2017.06.15
MSSQL MERGE / IF NOT EXISTS 문 사용법  (0) 2017.06.07
MSSQL 금액에 콤마표시하기  (0) 2017.05.25
Posted by 한설림
|

실제 작업시에는 대부분 unique index를 걸거나, primary key 를 걸어 놓아 그런 일이 벌어지지 않지만, 벌크로 데이터를 작업하거나 할 경우, 중복된 데이터를 보거나, 제거하고 싶을 때가 있습니다.

단순히 중복 카운트를 조회 하고 싶을 경우엔, 다음과 같이 grouping 하고 count를 세면 됩니다만,

-- 중복 카운트
SELECT some_id, COUNT(*)
  FROM tbl_some_table
 GROUP BY some_id
 HAVING COUNT(*) > 1;

-- 여러 컬럼의 중복 카운트
SELECT some_id, some_nm, some_description, COUNT(*)
  FROM tbl_some_table
 GROUP BY some_id, some_nm, some_description
 HAVING COUNT(*) > 1;

중복된 데이터 중, 첫번째(또는 마지막) 하나만 빼고 나머지를 조회한다거나, 삭제하고 싶을 때가 있습니다. 그러한 경우 다음과 같은 inline view 로 처리할 수 있습니다. (WITH 를 사용해도 되나, 하위 버전의 SQL 일 경우에는 WITH 구문이 먹지 않죠. 응? 하위 버전은 ROW_NUMBER 가 안 먹겠네요. 아이고 배야. - 하위 버전도 inline view 를 여럿 쓰면 되긴 합니다만.)

-- 중복 데이터를 알고 싶다.
SELECT *
  FROM (
          SELECT some_id
               , dup_idx = ROW_NUMBER() OVER (
                           PARTITION BY some_id ORDER BY some_id )
            FROM tbl_some_table (NOLOCK)
       ) tb_dup
 WHERE tb_dup.dup_idx > 1;

-- 중복 데이터 기준으로 중복된 데이터를 다 조회하고 싶다.
SELECT t.*
  FROM (
          SELECT some_id
               , dup_idx = ROW_NUMBER() OVER (
                           PARTITION BY some_id ORDER BY some_id )
            FROM tbl_some_table (NOLOCK)
       ) tb_dup INNER JOIN tbl_some_table t (NOLOCK)
                        ON t.some_id = tb_dup.some_id
 WHERE tb_dup.dup_idx > 1;

-- 중복 데이터를 지우고 싶다!!!
DELETE tb_dup
  FROM (
          SELECT some_id
               , dup_idx = ROW_NUMBER() OVER (
                           PARTITION BY some_id ORDER BY some_id )
            FROM tbl_some_table
       ) tb_dup
 WHERE tb_dup.dup_idx > 1;

-- 여러 컬럼일 경우? 중복 데이터를 지우고 싶다!!!
DELETE tb_dup
  FROM (
          SELECT some_id, some_nm, some_description
               , dup_idx = ROW_NUMBER() OVER (
                           PARTITION BY some_id, some_nm, some_description
                           ORDER BY some_id, some_nm, some_description )
            FROM tbl_some_table
       ) tb_dup
 WHERE tb_dup.dup_idx > 1;

이것 또한 그냥 메모입니다. 하하.



출처: http://withsoju.tistory.com/686 [읽든지 말든지]

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

MSSQL SPLIT 구현  (0) 2017.07.24
MSSQL PIOVT  (0) 2017.07.05
MSSQL 날짜 , 요일로 변환하기  (0) 2017.06.15
MSSQL MERGE / IF NOT EXISTS 문 사용법  (0) 2017.06.07
MSSQL 금액에 콤마표시하기  (0) 2017.05.25
Posted by 한설림
|

MSSQL PIOVT

DBMS/MSSQL 2017. 7. 5. 16:07
/* 샘플6 PIVOT / UNPIVOT 연산자 PIVOT ( 집계함수(열) FOR 새로운 열로 변경할 열이름 IN (열 목록) AS 피벗이름 ) */ CREATE TABLE ZSAMPLE6 ( UNAME NCHAR(3), SEASON NCHAR(2), AMOUNT INT ); INSERT INTO ZSAMPLE6 VALUES ('김길동', '겨울', 10) ,('이길동', '봄', 3) ,('홍길동', '겨울', 4) ,('황길동', '가을', 16) ,('구길동', '가을', 20) ,('박길동', '여름', 67) ; SELECT * FROM ZSAMPLE6 ORDER BY SEASON, UNAME; SELECT * FROM ZSAMPLE6 PIVOT ( SUM(AMOUNT) FOR SEASON IN ([], [어름], [가을], [겨울]) ) AS RESULT_PIVOT ;
UNAME
SEASON
AMOUNT
구길동
가을
20
황길동
가을
16
김길동
겨울
10
홍길동
겨울
4
이길동
봄 
3
박길동
여름
67
UNAME
여름
가을
겨울
구길동
NULL
NULL
20
NULL
김길동
NULL
NULL
NULL
10
박길동
NULL
NULL
NULL
NULL
이길동
3
NULL
NULL
NULL
홍길동
NULL
NULL
NULL
4
황길동
NULL
NULL
16
NULL


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

MSSQL SPLIT 구현  (0) 2017.07.24
MSSQL 중복 데이터 삭제  (0) 2017.07.24
MSSQL 날짜 , 요일로 변환하기  (0) 2017.06.15
MSSQL MERGE / IF NOT EXISTS 문 사용법  (0) 2017.06.07
MSSQL 금액에 콤마표시하기  (0) 2017.05.25
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 한설림
|

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 한설림
|

1. 숫자를 머니형으로 컨버트 한다.

   SELECT CONVERT(MONEY,1234567);

결과 : 1234567.00 


2. 콤마를 표기해주기 위해 다시 한번 컨버트를 해주면서 스타일을 1번으로 지정

   SELECT CONVERT(VARCHAR,CONVERT(MONEY,1234567),1) ;

결과 : 1,234,567.00


3. 뒤에 .00 이 보기 싫다면 REPLACE 처리를 해주자

  SELECT REPLACE(CONVERT(VARCHAR,CONVERT(MONEY,1234567),1) ,'.00','');

결과 : 1,234,567



'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 MERGE / IF NOT EXISTS 문 사용법  (0) 2017.06.07
Posted by 한설림
|