퇴근5분전

출처

https://stackoverflow.com/questions/27707421/sqlserver-multiple-pivot-on-same-columns

 

 

 

여기에 답변으로 달린..

SELECT ID,
       NAME,
       Max([Raised to Supplier(PLANED)])[Raised to Supplier(PLANED)],
       Max([Base Test Date(PLANED)])[Base Test Date(PLANED)],
       Max([Washing Approval(PLANED)])[Washing Approval(PLANED)],
       Max([Raised to Supplier(ACTUAL)])[Raised to Supplier(ACTUAL)],
       Max([Base Test Date(ACTUAL)])[Base Test Date(ACTUAL)],
       Max([Washing Approval(ACTUAL)])[Washing Approval(ACTUAL)]
FROM   (SELECT 1 ID,'45rpm' NAME,'Raised to Supplier' + '(PLANED)' MSNAME_pl,'Raised to Supplier' + '(ACTUAL)' MSNAME_ac,'2014-12-17' PLANED,'2015-12-17' ACTUAL
        UNION ALL
        SELECT 1,'45rpm','Base Test Date' + '(PLANED)','Base Test Date' + '(ACTUAL)','2014-12-18','2015-12-18'
        UNION ALL
        SELECT 1,'45rpm','Washing Approval' + '(PLANED)','Washing Approval' + '(ACTUAL)','2014-12-19','2015-12-19') a
       PIVOT ( Max(PLANED)
             FOR MSNAME_pl IN ([Raised to Supplier(PLANED)],
                               [Base Test Date(PLANED)],
                               [Washing Approval(PLANED)]) ) AS p1 

        PIVOT ( MAX(ACTUAL) 
              FOR MSNAME_ac IN ([Raised to Supplier(ACTUAL)],
                                [Base Test Date(ACTUAL)],
                                [Washing Approval(ACTUAL)])) p2
GROUP BY ID, NAME

 

결과

 

 지금은 쓸일은 없는데... 

최근 개발할때 써볼까 했다가... 잘 안되어서... 

끝나고 찾아보니 실행가능한 샘플이 있다.

 

일일 점검표 같은 걸 만들어줘야 하는데... 월간으로 보여줄지. 주간으로 보여줘야 할지... 

범위를 고려해야 하기 때문에 둘다 구하는 쿼리를 샘플로 만들었다. 

 

주간: 해당 일자가 포함된 주간의 일요일 ~ 토요일까지의 일자를 구한다.

월간: 해당 일자가 포함된 월의 1일 ~ 말일까지를 구한다.

 

* 예전에 만든 쿼리가 있긴 하네... 

* 임시테이블에 넣는거... 

 

* 오류 수정 :: 실제 적용해보니 원하던 결과가 아니었다. 

  04-13일요일을 설정하고 주간 정보를 보면 월요일 부터 나와야 할게 14일부터 보여져서 수정.( 04-23 )

DECLARE @TODAY DATETIME =  '2025-04-13 00:00:00'
--SET @TODAY = DATEADD( MINUTE, -(8*60+30), @TODAY )

-- 일요일부터 시작하면 : DATEADD( DAY, - CASE DATEPART(WEEKDAY, @TODAY) WHEN 1 THEN 7 ELSE  DATEPART(WEEKDAY, @TODAY) - 1 END + NUMBER,  @TODAY)
-- 월요일부터 시작하면 : DATEADD( DAY, - CASE DATEPART(WEEKDAY, @TODAY) WHEN 1 THEN 7 ELSE  DATEPART(WEEKDAY, @TODAY) - 1 END + NUMBER + 1,  @TODAY)

-- 해당 날자에 주간 
SELECT DATEADD( DAY, - CASE DATEPART(WEEKDAY, @TODAY) WHEN 1 THEN 7 ELSE  DATEPART(WEEKDAY, @TODAY) - 1 END + NUMBER + 1,  @TODAY)
  FROM MASTER..SPT_VALUES
 WHERE TYPE = 'P'
   AND NUMBER BETWEEN 0 AND 6

-- 해당 날자에 월간
SELECT DATEADD( DAY, (-1 * (DATEPART(DAY, @TODAY) - NUMBER - 1)), @TODAY)
     , DATENAME(WEEKDAY, DATEADD( DAY, (-1 * (DATEPART(DAY, @TODAY) - NUMBER - 1)), @TODAY))
  FROM MASTER..SPT_VALUES
 WHERE TYPE = 'P'
   AND NUMBER BETWEEN 0 AND DATEPART( DAY,  Eomonth( @TODAY ))-1

 

찾아보니 이것도 있네... 

set datefirst 1 -- 월요일은 1 화요일은 2 수요일은 3 ... 일요일은 7

'# 7) 데이타베이스 > Ms-Sql' 카테고리의 다른 글

멀티 PIVOT  (0) 2025.05.08
SSMS 에러 해결방법!!  (0) 2021.02.16
sqler 문제 풀이.  (0) 2017.05.22
sqler에 올라온 질문글...  (0) 2016.09.12
Sqler에 있는 질문에 대해 풀어봤다.  (0) 2016.05.20

에러 내용 : 

        ssms를 켜고 솔루션 창이나 출력, 속성창등을 드래그 해서 창을 프로그램에서 꺼낸 후 다시 드래그로

     원하는 위치로 넣을때 프로그램이 종료되는 현상.

 

 

해결방법 : 

    docs.microsoft.com/en-us/answers/questions/263738/ssms-188-crashes-when-re-docking-tabs.html

 

SSMS 18.8 crashes when re-docking tabs - Microsoft Q&A

 

docs.microsoft.com

   VinnieAmir-0621   <---- 이사람 답변

 

 구글번역 : 

모든 SSMS 창을 닫고 SQL Mgt Studio EXE 파일을 찾으십시오.

C:\Program Files(x86)\Microsoft SQL Server Management Studio 18\Common7\IDE 찾을 수 없는 경우

SSMS를 여는 데 사용하는 바로 가기를 마우스 오른쪽 단추로 클릭하고 속성> 파일 위치 열기로 이동합니다.

이 파일을 찾으면 "Ssms.exe.config"라는 파일도 찾아서 관리자 모드에서 메모장을 열고이 파일을 편집합니다.

그런 다음 라는 xml 태그를 찾아야하며 다음을 정확히 APPEND (대체 아님)해야합니다.

;Switch.System.Windows.Interop.MouseInput.OptOutOfMoveToChromedWindowFix=true;Switch.System.Windows.Interop.MouseInput.DoNotOptOutOfMoveToChromedWindowFix=true

 

ssms.exe.config 중에서 수정한 부분

 

그리고 그게 다입니다. 이제이 불쾌한 충돌을 피할 수 있습니다.

https://support.microsoft.com/en-us/topic/february-9-2021-kb4601060-cumulative-update-for-net-framework-3-5-and-4-7-2-for-windows-10-version-1809-and-windows-server-version-2019-b240d07e-639f-d708-98c9-0cbe443176aa

 

 

ps : 

    새 프로젝트를 시작하면서 기존 노트북이 망가져서 새 노트북에 환경설정을 마쳤었다. 

   크리스탈 리포트 관련 이슈가 있어서 해결하는 과정에서 ssms를 실행하고 프로시저를 확인하려고 

  내가 만들어 넣은 오브젝트 탐색기를 가동시켜 프로시저를 찾았는데...

  이게 설정 후 처음 열리는 것이라 팝업형태로 떠있길래 드래그 해서 프로그램안으로 밀어넣었는데... 

  강제종료??? 

 

  여러번 해봤지만 역시나 에러로 종료되어 내 개발pc에서 확장프로그램 소스를 이용하여 ssms를 열고 동일한 에러가 발생하였다. ssms버젼확인 후 18.5에서 해결되었다는 글을 보고 최신버젼 18.8을 설치하였으나 동일한 증상이 일어났다.

 

  혹시나 하여 14, 16, 17버젼 모두 실행해서 확인해본결과 14빼고 모두 동일하게 강제종료 되었다.

 잘 되던게 왜이러나 하고... 고민하던 중에... 내가 만든 것만 그런가? 라는 생각에...

 ssms에 원래 있던 창인 "출력" 창을 열어서 드래그해서 붙여보니 ... 동일하게 강제종료 현상이 발생하였다. 

다행이 내 프로그램문제는 아니구나 하고 검색... 검색... ....

 

 찾았다. 영어가 안되는게 참 서글픈... 크롬에서 번역기능이 없었으면... 찾았을까 싶다.

 머리가 나빠서 쉽지 않은 삶이야...

 

 

 

환경 : 오라클 12C

 

피봇은 주로 사용해왔으니... 원래 알던 개념이었다.

언피봇은 무조건 피봇의 반대라고 생각했었는데...

 

율촌 프로젝트 하면서 공부를 다시 하게 되었다.

언피봇과 피봇을 합치면 멋진 결과가 나오더라.

 - MES 생산결과를 뽑아 낼때 투입대비, 생산량을 뽑아내는 쿼리에 적용했었다.

 -- 탭키 간격이 안먹넹...

 

SELECT *
FROM
(
SELECT *
FROM
(
SELECT '데이타' A, 1 K, 10 DATA1, 20 DATA2
,'NO 1의 설명' NO1_DESC
,'NO 2의 설명' NO2_DESC
FROM DUAL
UNION ALL
SELECT '데이타' A, 2 K, 30 DATA1, 40 DATA2
,'NO 1의 설명' NO1_DESC
,'NO 2의 설명' NO2_DESC
FROM DUAL
UNION ALL
SELECT '데이타' A, 3 K, 50 DATA1, 60 DATA2
,'NO 1의 설명' NO1_DESC
,'NO 2의 설명' NO2_DESC
FROM DUAL
) A
UNPIVOT
(
( NO_DESC, DATA ) FOR
NO IN
(
(NO1_DESC, DATA1) AS 1,
(NO2_DESC, DATA2) AS 2
)
)
) T
PIVOT
(
MIN( DATA ) AS DATA FOR
K IN ( 1 , 2, 3 )
)
;

 

언피봇 한 결과
위 결과를 피봇한 결과

 

** 음... mssql이랑 다른가? 이상하게 동작하네...

   오라클은 위 문법에 맞춰서 작성하면 잘 되던뎅...

동일한 결과로 mssql로 만들려면 다르게 작성해야 한다.

 

unpivot 도 내가 원래 알던대로 mssql은 동작하고...

오라클로 테스트를 못해보니까 아쉽네...

뭔가 좀 다르게 동작하는 듯 한데... 어떻게 보면 같은것 같기도 하고...

다음에 오라클 쓸때가 오면 다시 비교해봐야겠다.

 

'# 7) 데이타베이스 > 오라클' 카테고리의 다른 글

집계함수 MIN, MAX에 해당하는 다른 컬럼값은?  (0) 2019.11.03
GROUP 콤마구분자로 연결하기  (0) 2019.11.03
달력2  (0) 2019.11.03
달력 1  (0) 2019.11.03
[오라클] 동적쿼리  (0) 2010.10.24

환경 : 오라클 12C

 

-- 해석 : K가 가장 높은 값의 V는 뭐지?,

--          K가 가장 낮은 값의 V는 뭐지?

SELECT MAX( V ) KEEP ( DENSE_RANK FIRST ORDER BY K DESC ) MAX_K_V

        , MIN( V ) KEEP ( DENSE_RANK LAST ORDER BY K DESC ) MIN_K_V

FROM

(

SELECT 1 K, 'A' V FROM DUAL UNION ALL

SELECT 0 K, 'B' V FROM DUAL UNION ALL

SELECT 3 K, 'C' V FROM DUAL UNION ALL

SELECT 9 K, 'D' V FROM DUAL UNION ALL

SELECT 5 K, 'E' V FROM DUAL UNION ALL

SELECT 6 K, 'F' V FROM DUAL

) Z

'# 7) 데이타베이스 > 오라클' 카테고리의 다른 글

피봇(pivot)과 언피봇(unpivot) 응용  (0) 2019.11.03
GROUP 콤마구분자로 연결하기  (0) 2019.11.03
달력2  (0) 2019.11.03
달력 1  (0) 2019.11.03
[오라클] 동적쿼리  (0) 2010.10.24

환경 : 오라클 12C

 

 

SELECT LISTAGG( GROUP_KEY || '_V, ' || GROUP_KEY || '_R' , ', ') WITHIN GROUP (ORDER BY GROUP_KEY) V1

FROM (

SELECT 1 GROUP_KEY FROM DUAL UNION ALL

SELECT 2 GROUP_KEY FROM DUAL UNION ALL

SELECT 3 GROUP_KEY FROM DUAL UNION ALL

SELECT 4 GROUP_KEY FROM DUAL

) A;

 

결과 : 1_V, 1_R, 2_V, 2_R, 3_V, 3_R, 4_V, 4_R

 

 

반대로

 

select TRIM(REGEXP_SUBSTR( COLS, '[^,]+', 1, 1, 'i')) COL1

,TRIM(REGEXP_SUBSTR( COLS, '[^,]+', 1, 2, 'i')) COL2

,TRIM(REGEXP_SUBSTR( COLS, '[^,]+', 1, 3, 'i')) COL3

,TRIM(REGEXP_SUBSTR( COLS, '[^,]+', 1, 4, 'i')) COL4

from

(

SELECT 'A,B,C,D' COLS

FROM DUAL

) a

;

'# 7) 데이타베이스 > 오라클' 카테고리의 다른 글

피봇(pivot)과 언피봇(unpivot) 응용  (0) 2019.11.03
집계함수 MIN, MAX에 해당하는 다른 컬럼값은?  (0) 2019.11.03
달력2  (0) 2019.11.03
달력 1  (0) 2019.11.03
[오라클] 동적쿼리  (0) 2010.10.24

환경 : 오라클 12C

 

 일하다보면 스케쥴관리를 구현할때가 있는데...

그 샘플 쿼리이다.

 

 

WITH MONTH_DAY

AS

(

SELECT ( TRUNC( TO_DATE( :AV_DAY , 'YYYYMMDD'), 'MM') -1 * ( TO_CHAR( TRUNC( TO_DATE(:AV_DAY, 'YYYYMMDD'), 'MM'), 'D' ) - 1 )) + LEVEL - 1 DD

FROM DUAL

CONNECT BY LEVEL <= ( ( LAST_DAY( TO_DATE(:AV_DAY, 'YYYYMMDD') ) + ( 7 - TO_CHAR( LAST_DAY( TO_DATE(:AV_DAY, 'YYYYMMDD') ), 'D' ))) -- 종료일

- ( TRUNC( TO_DATE(:AV_DAY, 'YYYYMMDD'), 'MM') -1 * ( TO_CHAR( TRUNC( TO_DATE(:AV_DAY, 'YYYYMMDD'), 'MM'), 'D' ) - 1 )) + 1 ) -- 시작일

), DATA_TMP

AS

(

SELECT LEVEL - 1 LV

FROM DUAL

CONNECT BY LEVEL <= 5

)

, DATA_CONT

AS

(

SELECT A.LV, B.DD, B.VAL1

FROM DATA_TMP A

,

(

SELECT TO_DATE( '20190303', 'YYYYMMDD') DD, 1 LV, '값1' VAL1 FROM DUAL UNION

SELECT TO_DATE( '20190303', 'YYYYMMDD') DD, 2 LV, '값2' VAL1 FROM DUAL UNION

SELECT TO_DATE( '20190403', 'YYYYMMDD') DD, 1 LV, '0403' VAL1 FROM DUAL UNION

SELECT TO_DATE( '20190303', 'YYYYMMDD') DD, 3 LV, '332' VAL1 FROM DUAL

)B

WHERE A.LV = B.LV(+)

)

, MONTH_DAY_WEEK

AS

(

SELECT A.DD

, TRUNC( (TO_NUMBER( A.DD - ( TRUNC( TO_DATE(:AV_DAY, 'YYYYMMDD'), 'MM') -1 * ( TO_CHAR( TRUNC( TO_DATE(:AV_DAY, 'YYYYMMDD'), 'MM'), 'D' ) ))) - 1 )/ 7) WEEK

, TO_CHAR( A.DD, 'DY' ) DAYOFWEEK

, B.LV

, CASE WHEN B.LV = 0 THEN TO_CHAR( A.DD, 'DD' ) ELSE C.VAL1 END VAL1

FROM MONTH_DAY A, DATA_TMP B, DATA_CONT C

WHERE A.DD = C.DD(+)

AND B.LV = C.LV(+)

)

 

select *

from

(

SELECT TO_CHAR( MIN(DD), 'YYYYMMDD') || '~' || TO_CHAR( MAX( DD ), 'YYYYMMDD') FROMTO

, WEEK

, LV

, MAX("''") "SUN"

, MAX("''") "MON"

, MAX("''") "TUE"

, MAX("''") "WED"

, MAX("''") "THU"

, MAX("''") "FRI"

, MAX("''") "SAT"

FROM MONTH_DAY_WEEK

PIVOT

(

MAX( VAL1 ) FOR DAYOFWEEK IN ( '', '', '', '', '', '', '' )

) A

GROUP BY WEEK, LV

ORDER BY WEEK, LV

)

;

 

스케쥴이 포함된 달력 표시

 

환경 : 오라클 12C

 

WITH MONTH_DAY

AS

(

SELECT ( TRUNC( TO_DATE( :AV_DAY , 'YYYYMMDD'), 'MM') -1 * ( TO_CHAR( TRUNC( TO_DATE(:AV_DAY, 'YYYYMMDD'), 'MM'), 'D' ) - 1 )) + LEVEL - 1 DD

FROM DUAL

CONNECT BY LEVEL <= ( ( LAST_DAY( TO_DATE(:AV_DAY, 'YYYYMMDD') ) + ( 7 - TO_CHAR( LAST_DAY( TO_DATE(:AV_DAY, 'YYYYMMDD') ), 'D' ))) -- 종료일

- ( TRUNC( TO_DATE(:AV_DAY, 'YYYYMMDD'), 'MM') -1 * ( TO_CHAR( TRUNC( TO_DATE(:AV_DAY, 'YYYYMMDD'), 'MM'), 'D' ) - 1 )) + 1 ) -- 시작일

)

, MONTH_DAY_WEEK

AS

(

SELECT DD

, TRUNC( (TO_NUMBER(DD - ( TRUNC( TO_DATE(:AV_DAY, 'YYYYMMDD'), 'MM') -1 * ( TO_CHAR( TRUNC( TO_DATE(:AV_DAY, 'YYYYMMDD'), 'MM'), 'D' ) ))) - 1 )/ 7) WEEK

, TO_CHAR( DD, 'DY' ) DAYOFWEEK

, TO_CHAR( DD, 'DD' ) VAL1

FROM MONTH_DAY

)

SELECT TO_CHAR( MIN(DD), 'YYYYMMDD') || '~' || TO_CHAR( MAX( DD ), 'YYYYMMDD') FROMTO

, WEEK

, MAX("''") "SUN"

, MAX("''") "MON"

, MAX("''") "TUE"

, MAX("''") "WED"

, MAX("''") "THU"

, MAX("''") "FRI"

, MAX("''") "SAT"

FROM MONTH_DAY_WEEK

PIVOT

(

MAX( VAL1 ) FOR DAYOFWEEK IN ( '', '', '', '', '', '', '' )

) A

GROUP BY WEEK

ORDER BY WEEK

;

 

:AV_DAY := '20191001'

 

달력이 표시됨.

 

 

sqler 질문글..

http://www.sqler.com/942478#1

 

아래처럼 풀이해봤음.

 

/*
col1 | col2

 1       10

 2       20

 3       30

 4       40

*/


;with tb
as
(
 select 1 as col1, 10 as col2
 union
 select 2 as col1, 20 as col2
 union
 select 3 as col1, 30 as col2
 union
 select 4 as col1, 40 as col2
)

select case when col = 1 then tmp1.col1 else tmp2.col11 end as col1,
   case when col = 1 then tmp1.col2 else tmp2.col22 end as col2
from ( values( 1),( 2 ) ) as tab ( col )
left join
(
 select 1 as k, col1, col2
 from tb
) as tmp1
on   tab.col = tmp1.k
left join
(
 select 2 as k, count( col1 ) as col11, sum( col2 ) as col22
    from tb
) as tmp2
on tab.col = tmp2.k

 

 

 

 

sqler에 질문글..

http://www.sqler.com/bSQLQA/862019

 

심심해서....  

 

 

;with tmp
as
(
select *
from
(
    values 
        (1,         '2008-01-02 00:00:00.000' ),
        (2,          NULL),
        (3,          NULL),
        (4,          '2008-01-03 00:00:00.000'),
        (5,          NULL),
        (6,          NULL),
        (7,          NULL),
        (8,          NULL),
        (9,          '2008-01-04 00:00:00.000'),
        (10,         NULL),
        (11,         NULL)
) as tb (a, b )
)

select a, isnull( b , ( select max( b ) from tmp where a < bs.a )) as bb
from tmp as bs