퇴근5분전


음 아래처럼 하면 가져온다.


출처 : http://translate.google.co.kr/translate?hl=ko&langpair=en%7Cko&u=http://wiki.lessthandot.com/index.php/Get_The_Domain_Name_Of_Your_SQL_Server_Machine_With_T-SQL

DECLARE @DOMAINNAME NVARCHAR(100)
EXEC MASTER.DBO.XP_REGREAD
    'HKEY_LOCAL_MACHINE',
    'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon',
    N'CachePrimaryDomain',    
    @DOMAINNAME OUT

SELECT @DOMAINNAME


 


오라클 강좌를 보면서 멋지다 생각했던 쿼리를 ms-sql로 바꾸어 보았다.

물론 이 쿼리는 테스트용도로 변경한 쿼리임.




select  (case [key] when '1' then ' '+t.[name] else '합계' end ) [구분],  
           sum( a ) [a합계],
           sum( b ) [b합계]
from
(
 select 'a' name, 1 a , 2  b
 union all
 select 'b' name, 1 a , 2  b
 union all
 select 'c' name, 1 a , 2  b
)t,
(
 select '1' [key]
 union all
 select '2' [key]
)u
group by ( case [key] when '1' then ' '+t.name else '합계' end )
 

굵게 표시된 그룹바이 키는 동일하게 적용되어야 표시가 된다.

결과 :




## 집합 적인 사고!!! 카티션곱!!


문제가 좀 있는 쿼리로.. 해결방법을 고민중...


부서 정보를 끌어올리고  사용자 정보를 모아서

부서별 직원정보를 만든 후

>>  각 직원별 자기 상급자들을 하나의 컬럼에 순서대로 나열하고자 만든 쿼리이나..

>> 중간 부서에 다수의 상급자가 존재 시 이하 부서직원들의 갯수가 뻥튀기 되는 현상이 CTE에서 발생하는데

이를 해결할 다른 방법은 없는 것일까???



declare @BaseDept table
(
 deptcode varchar(40 ),
 parentdeptcode varchar(40),
 deptname varchar(40)
)

insert into @BaseDept values( '000', null ,  '플랜트')
insert into @BaseDept values( 'a00', '000' , '공장1')
insert into @BaseDept values( 'b00', '000' , '공장2')
insert into @BaseDept values( 'c00', 'a00' , '검사')
insert into @BaseDept values( 'd00', 'a00' , '조립')
insert into @BaseDept values( 'e00', 'c00' , '수리')
insert into @BaseDept values( 'f00', 'b00' , '출하')

declare @BaseUser table
(
 userId varchar(40),
 deptcode varchar(40),
 userName varchar(100)
)

insert into @BaseUser values ( 'u01', '000' , '사장1' )
insert into @BaseUser values ( 'u02', 'a00' , '공장1장장' )
insert into @BaseUser values ( 'u03', 'b00' , '공장2장장' )
insert into @BaseUser values ( 'u04', 'c00' , '테스터' )
insert into @BaseUser values ( 'u05', 'd00' , '조립맨' )
insert into @BaseUser values ( 'u06', 'e00' , 'A/s맨' )
insert into @BaseUser values ( 'u07', 'f00' , '오라이' )
insert into @BaseUser values ( 'u08', 'a00' , '잉여' )

declare @ttt table ( userid varchar(40) )


;with dept( deptcode , parentdeptCode , deptname , lvl , sort )as

 select  deptcode , parentdeptCode , deptname , 0 , cast( deptcode as varbinary(900))
 from @BaseDept
 where deptcode = '000'
 union all
 select a.deptcode , a.parentdeptCode , a.deptname , lvl + 1 , cast( sort + cast( a.deptcode as binary(3) ) as varbinary(900))
 from @BaseDept a inner join dept b
 on a.parentdeptCode = b.deptcode
)
, [user]( userid , deptcode , userName )as

 select userid , deptcode , userName from @BaseUser
)

, dept_user( deptcode , parentdeptCode , deptname , lvl , sort,   userid , userName)as
(
 
 select a.deptcode , a.parentdeptCode , a.deptname , a.lvl , a.sort,   b.userid , b.userName
 from dept a left outer join [user] b on a.deptcode = b.deptcode
)
 
select  row_number() over( order by b.deptcode ),  replicate( '.------> ',  lvl ) + deptName [Tree] , b.deptcode , parentdeptCode , deptname , lvl , sort,   userid , userName, cnt, no
from  dept_user  b
left outer join
(
 select  row_number() over (order by deptcode, userid ) no,  deptcode , count( 1 ) cnt
 from  dept_user
 group by deptcode, userid
) c
on b.deptcode = c.deptcode
order by sort


--/* 각자의 상급자 컬럼을 추가 */
--
--,aboveDept_user ( [no], [no2], deptcode , parentdeptCode , deptname , ltl , srt ,   userid , userName , aboveuser  ) as
--(
-- select  cast( row_number() over( order by userid ) as int), 100,  deptcode , parentdeptCode , deptname , 0 , cast( deptcode as varbinary(900)) , userid ,  userName , cast( '/' + userName as varchar(3000))
-- from dept_user
-- where deptcode = '000'
-- union all
-- select  au.no , cast( row_number() over( order by du.userid ) as int) no2,  du.deptcode, du.parentdeptCode, du.deptname , ltl +1 , cast( srt + cast( du.deptcode as binary(3) ) as varbinary(900)) ,   du.userid , du.userName, cast( aboveuser + '/' + du.username as varchar( 3000 ))
-- from dept_user du inner join aboveDept_user au
-- on  du.parentdeptcode = au.deptcode
--)
--
--select replicate( '.------>',  ltl ) + deptName [Tree] , *
--from aboveDept_user ms
--inner join
--(
-- select deptcode, max( isnull( case when no = 1 then  userid+'('+ username+')' else '' end  , '') ) +  max( isnull( case when no = 2 then  userid+'('+ username+')' else '' end  , '') ) as [desc]
-- from aboveDept_user
-- group by deptcode 
--) sl
--on ms.deptcode = sl.deptcode
----order by srt;


옛날 꼰날... 작업하던중

XML을 통째로 DataTable에 쿼리 하려고 했던적이 있었는데...

잊어버렸다가... 지금 하는 일에 다시 적용해야 될 사항이 생겨서 찾아서 예제로 남김.

어려운거 없다...

-- 예제 결과



-- XML 데이타

<ROOT xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <INFO>
    <SEQ>1</SEQ>
    <OLDNM>a군</OLDNM>
    <NEWNM />
  </INFO>
  <INFO>
    <SEQ>2</SEQ>
    <OLDNM>b군</OLDNM>
    <NEWNM />
  </INFO>
  <INFO>
    <SEQ>3</SEQ>
    <OLDNM>c군</OLDNM>
    <NEWNM />
  </INFO>
</ROOT>




-- 예제 소스
DECLARE @INFO TABLE
(
    SEQ  VARCHAR(100),
    NM  VARCHAR(100)
)

 

INSERT INTO @INFO VALUES ('1', 'a군' )
INSERT INTO @INFO VALUES ('2', 'b군' )
INSERT INTO @INFO VALUES ('3', 'c군' )

SELECT SEQ, NM as OLDNM, '' [NEWNM] FROM @INFO


DECLARE @XML XML

SET @XML = REPLACE( (SELECT SEQ, NM as OLDNM, '' [NEWNM] FROM @INFO  FOR XML PATH('INFO'), ROOT ('ROOT')) , '<ROOT>' , '<ROOT xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" >')

SELECT @XML AS [XML]

declare @RegistXML XML
set @RegistXML = '
<ROOT xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <INFO>
    <SEQ>1</SEQ>
    <OLDNM>a군</OLDNM>
    <NEWNM>x군</NEWNM>
  </INFO>
  <INFO>
    <SEQ>2</SEQ>
    <OLDNM>b군</OLDNM>
    <NEWNM>b군</NEWNM>
  </INFO>
  <INFO>
    <SEQ>3</SEQ>
    <OLDNM>c군</OLDNM>
    <NEWNM></NEWNM>
  </INFO>
</ROOT>'

SELECT
 M.Item.query('./SEQ').value('.','VARCHAR(100)') SEQ,
 M.Item.query('./OLDNM').value('.','VARCHAR(100)') [OLDNM],
 M.Item.query('./NEWNM').value('.','VARCHAR(100)') [NEWNM]
FROM @RegistXML.nodes('/ROOT/INFO') AS M(ITEM)

UPDATE @INFO
SET NM = T.[NEWNM]
FROM  (
  SELECT
   M.Item.query('./SEQ').value('.','VARCHAR(100)') SEQ,
   M.Item.query('./OLDNM').value('.','VARCHAR(100)') [OLDNM],
   M.Item.query('./NEWNM').value('.','VARCHAR(100)') [NEWNM]
  FROM @RegistXML.nodes('/ROOT/INFO') AS M(ITEM)
) T
INNER JOIN @INFO B
ON T.SEQ = B.SEQ and T.[NEWNM] <> ''

SELECT * FROM @INFO

/* XML을TABLE로*/
 
--SELECT * FROM TB_BASE_USER
--WHERE USER_NM LIKE 'KCC%'

반대로 table을 다시 xml로 바꿀때

declare @xxx xml = '<ROOT xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">' + ( SELECT * FROM @INFO FOR XML PATH ('INFO') ) + '</ROOT>'
 
select @xxx


[쿼리1.]

SELECT CNT, CASE WHEN 4 <= RET AND RET  <= 7 THEN 1 ELSE 0 END RET, CASE WHEN 6 <= [PLAN] AND [PLAN] <= 10 THEN 1 ELSE 0 END PL
FROM @TABLE
WHERE RET BETWEEN 4 AND 7  OR [PLAN] BETWEEN 6 AND 10

SELECT ISNULL(SUM( CASE WHEN RET = 1 THEN CNT ELSE 0 END ),0) RETSUM , ISNULL(SUM( CASE WHEN PL = 1 THEN CNT ELSE 0 END ),0) PLANSUM
FROM(
  SELECT CNT,  CASE WHEN 4 <= RET AND RET  <= 7 THEN 1 ELSE 0 END RET, CASE WHEN 6 <= [PLAN] AND [PLAN] <= 10 THEN 1 ELSE 0 END PL
  FROM @TABLE
  WHERE (RET BETWEEN 4 AND 7  OR [PLAN] BETWEEN 6 AND 10)  
)K

[쿼리2.]

SELECT  SA, SB
FROM
(
  SELECT 'A' [KEY], SUM( CNT ) SA
  FROM @TABLE
  WHERE RET BETWEEN 4 AND 7 
) A
INNER JOIN
(
  SELECT 'A' [KEY],  SUM( CNT ) SB
  FROM @TABLE
  WHERE [PLAN] BETWEEN 6 AND 10  
)B
ON A.[KEY] = B.[KEY]

실행계획




http://aseuka.tistory.com/entry/MS-SQL  이 글에 이어 써본다.

위 두 쿼리 결과는 동일하게  4, 5가 나온다.

다만 테이블을 1번 읽었을때와 2번읽었을때를 비교해보기 위해 이글을 써보며

아직 해당 지식이 완전하게 흡수하지 못한점을 미리 써둔다. 


일단 IO가 많이 발생하면 쿼리 개선이 필요하다고 하니... 
                               1번 쿼리                       2번 쿼리
IO 비용                 :    0.0032035                      (0.003125 * 2) 

또 마지막 결과에 대한 트리비용에 대해 확인해보자
                                1번 쿼리                       2번 쿼리 
예상 하위 트리비용 :    0.0032846                      0.0065743

Sort는 둘다 일어나지 않는다!





수치적으로 두배정도 차이나는데

2번 쿼리는 굳이 필요없는 Nested Loops 를 하고 있는 점.
동일 쿼리를 2번 행하고 있는것... 그림으로만 봐도 두배는 걸리는게 맞을것이다.

전에도 실행계획을 보다 보다 모르는게 많아서 패스 했는데

이참에 찾아서 정리해야겠다.

? Stream Aggregate
? Compute Scalar
? Nested Loops

Hash.. 어쩌고 저쩌고.. 참 많은뎁!!

















하나의 데이타 테이블에서  두개의 컬럼의 각각 범위로 조회를 한방에 해서

각각의 그룹바이를 취하는 방법...

역시 공부한 보람이 있다눈..

아래 그림에서 보다싶이 원본데이타에서

범위를 지정해서 범위내 데이타에 대해 컬럼 값을 1로 치환 하고

그 데이타를 그룹바이 걸어서 각각 값을 구하는 방법임.







declare @table  table
(
     [Cnt] int,
     [ret]  int,
     [plan] int
)

insert into @table values(1, 1, 6 );
insert into @table values(1, 2, 7 );
insert into @table values(1, 3, 8 );
insert into @table values(1, 4, 9 );
insert into @table values(1, 5, 10 );
insert into @table values(1, 6, 11 );
insert into @table values(1, 7, 12 );
insert into @table values(1, 8, 13 );


select * from @table

SELECT CNT,  CASE WHEN 4 <= RET AND RET  <= 7 THEN 1 ELSE 0 END RET, CASE WHEN 6 <= [PLAN] AND [PLAN] <= 10 THEN 1 ELSE 0 END PL
FROM @TABLE
WHERE RET BETWEEN 4 AND 7  OR [PLAN] BETWEEN 6 AND 10

SELECT ISNULL(SUM( CASE WHEN RET = 1 THEN CNT ELSE 0 END ),0) RETSUM , ISNULL(SUM( CASE WHEN PL = 1 THEN CNT ELSE 0 END ),0) PLANSUM
FROM(
  SELECT CNT,  CASE WHEN 4 <= RET AND RET  <= 7 THEN 1 ELSE 0 END RET, CASE WHEN 6 <= [PLAN] AND [PLAN] <= 10 THEN 1 ELSE 0 END PL
  FROM @TABLE
  WHERE (RET BETWEEN 4 AND 7  OR [PLAN] BETWEEN 6 AND 10)  
)K

 

오라클에서 했던걸 MS로 바꿔보았다
쿼리야 오라클이나 MS나...

누적이라서 ^^ 이정도면 뭐...

SELECT YEAR0_SUMAMT ,
            (
             SELECT SUM( YEAR0_SUMAMT )
             FROM  PLAN_RESULTS  
             WHERE YYYYMM <= A.YYYYMM
          AND     GIGUM_CODE = A.GIGUM_CODE
            ) YEAR0SUM
FROM PLAN_RESULTS  A





SELECT 쿼리 처리순서인데... 대략 쿼리를 날려보면서 추측했던 내용인데

오라클 공부하면서 이거저거 뒤지다 찾았다.. 거의 틀리지 않네..


Ms-SQL 쿼리 처리 순서 http://technet.microsoft.com/ko-kr/library/ms189499.aspx
SELECT 문의 처리 순서
다음 단계에서는 SELECT 문의 처리 순서를 보여 줍니다.
1. FROM
2. ON
3. JOIN
4. WHERE
5. GROUP BY
6. WITH CUBE 또는 WITH ROLLUP
7. HAVING
8. SELECT
9. DISTINCT
10. ORDER BY
11. TOP


 C# 에 심취해서 쿼리에 대한 내용을 블로깅 해두지 않았었는데...

오라클을 다루다 보니 작업처리 방법등은 기록해두는것이 괜찮을듯 하다.



아래 색 처리한 부분은

F 3609565874.83333
K 0.002083333
T 369980.502170417

요런 데이타에

 = SQRT( (  2 * F * T ) * K )  라는 결과값을 한행 더 추가해야 될 경우

위 세개의 데이타를 옆으로 펼치면..

         F_AVG, T_AVG, K_AVG,  F_BASE, T_BASE, K_BASE, F_UPPER, T_UPPER, K_UPPER

형태로 변환해서 계산식을 적용해주어야 한다.

이때 위 쿼리에 컬럼을 하나 추가하여 그룹바이로 통합시켜주면 1개의 쿼리로 바꿀수 있게 된다.

방법 1)

--USE [TestDB]
--GO
/****** 개체:  Table [dbo].[Plan_Results]    스크립트 날짜: 10/23/2010 19:50:45 ******/
--SET ANSI_NULLS ON
--GO
--SET QUOTED_IDENTIFIER ON
--GO
--SET ANSI_PADDING ON
--GO
--CREATE TABLE [dbo].[Plan_Results](
-- [Gigum_Code] [char](1) COLLATE Korean_Wansung_CI_AS NOT NULL,
-- [YYYYMM] [char](7) COLLATE Korean_Wansung_CI_AS NOT NULL,
-- [Year0_SumAmt] [numeric](18, 6) NULL,
-- [Year3_SumAmt] [numeric](18, 6) NULL,
-- [Year5_SumAmt] [numeric](18, 6) NULL,
-- CONSTRAINT [PK_Plan_Results] PRIMARY KEY CLUSTERED
--(
-- [Gigum_Code] ASC,
-- [YYYYMM] ASC
--)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
--) ON [PRIMARY]
--
--GO
--SET ANSI_PADDING OFF

--insert into Plan_Results values ( 1 , '2010-01',   881728083,-     21455788882,-   26296054501    )
--insert into Plan_Results values ( 1 , '2010-02',  1663456166,-  93932311442,-  67724751121 )
--insert into Plan_Results values ( 1 , '2010-03', 10535184250,-  39727311735,-  27162544453 )
--insert into Plan_Results values ( 1 , '2010-04', 10916912333,-  37168124598,-  24826804875 )
--insert into Plan_Results values ( 1 , '2010-05', 10798640416,- 332748211345,- 200422034557  )
--insert into Plan_Results values ( 1 , '2010-06', 12360368500,- 546349938762,- 336875250117 )
--insert into Plan_Results values ( 1 , '2010-07',  8342096583,- 526987602935,- 321423734623 )
--insert into Plan_Results values ( 1 , '2010-08',  3223824666,- 395509716668,- 245811417447 )
--insert into Plan_Results values ( 1 , '2010-09',  5355552750,- 281646305135,- 157115087823 )  
--insert into Plan_Results values ( 1 , '2010-10',-  562719166,- 233716812282,- 136073606419 ) 
--insert into Plan_Results values ( 1 , '2010-11',- 7580991083,- 193765514755,- 109664461049 )
--insert into Plan_Results values ( 1 , '2010-12',-12619263000,- 176147709331,-  95575440266 )

DECLARE @OP FLOAT
DECLARE @OP2 FLOAT

SET @OP = 2.50 /100 /12   -- 적용금리
SET @OP2 = 0.123 /100 /12  -- 운용수수료

 SELECT 'F' AS [HEADER] ,
   AVG( YEAR0_SUMAMT ) AS [AVG],
   SUM( CASE WHEN RIGHT(YYYYMM,2)= '01' THEN YEAR0_SUMAMT ELSE 0 END ) AS [BASE],
   MAX( YEAR0_SUMAMT ) AS [UPPER]
 FROM PLAN_RESULTS
 GROUP BY GIGUM_CODE
UNION 
 SELECT 'K', @OP, @OP, @OP
UNION
 SELECT 'T' AS [HEADER] ,
   AVG( YEAR0_SUMAMT ) * @OP2 AS [AVG],
   SUM( CASE WHEN RIGHT(YYYYMM,2)= '01' THEN YEAR0_SUMAMT ELSE 0 END ) * @OP2 AS [BASE],
   MAX( YEAR0_SUMAMT ) * @OP2 AS [UPPER]
 FROM PLAN_RESULTS
 GROUP BY GIGUM_CODE

UNION

 SELECT 'C', SQRT( ( 2* SUM(CASE WHEN HEADER = 'F' THEN [AVG] ELSE 0 END ) * -- AVG1,
   SUM(CASE WHEN HEADER = 'T' THEN [AVG] ELSE 0 END ) ) / -- AVG2,
   SUM(CASE WHEN HEADER = 'K' THEN [AVG] ELSE 0 END ) ),   -- AVG3,

      SQRT( ( 2 * SUM(CASE WHEN HEADER = 'F' THEN [BASE] ELSE 0 END ) * -- BASE1,
   SUM(CASE WHEN HEADER = 'T' THEN [BASE] ELSE 0 END ) )/ -- BASE2,
   SUM(CASE WHEN HEADER = 'K' THEN [BASE] ELSE 0 END ) ), --BASE3,

   SQRT( (2 * SUM(CASE WHEN HEADER = 'F' THEN [UPPER] ELSE 0 END ) *-- UPPER1,
   SUM(CASE WHEN HEADER = 'T' THEN [UPPER] ELSE 0 END ) )/ -- UPPER2,
   SUM(CASE WHEN HEADER = 'K' THEN [UPPER] ELSE 0 END ) ) -- UPPER3

 FROM
 (
  SELECT 0 [KEY], 'F' AS [HEADER] ,
    AVG( YEAR0_SUMAMT ) AS [AVG],
    SUM( CASE WHEN RIGHT(YYYYMM,2)= '01' THEN YEAR0_SUMAMT ELSE 0 END ) AS [BASE],
    MAX( YEAR0_SUMAMT ) AS [UPPER]
  FROM PLAN_RESULTS
  GROUP BY GIGUM_CODE
  UNION 
  SELECT 0, 'K', @OP, @OP, @OP
  UNION
  SELECT 0, 'T' AS [HEADER] ,
    AVG( YEAR0_SUMAMT ) * @OP2 AS [AVG],
    SUM( CASE WHEN RIGHT(YYYYMM,2)= '01' THEN YEAR0_SUMAMT ELSE 0 END ) * @OP2 AS [BASE],
    MAX( YEAR0_SUMAMT ) * @OP2 AS [UPPER]
  FROM PLAN_RESULTS
  GROUP BY GIGUM_CODE
 ) T
 GROUP BY [KEY]

UNION

 SELECT '_C', SQRT( ( 2* SUM(CASE WHEN HEADER = 'F' THEN [AVG] ELSE 0 END ) * -- AVG1,
   SUM(CASE WHEN HEADER = 'T' THEN [AVG] ELSE 0 END ) ) / -- AVG2,
   SUM(CASE WHEN HEADER = 'K' THEN [AVG] ELSE 0 END ) )    -- AVG3,
    + SUM( CASE WHEN HEADER = 'F' THEN [BASE] ELSE 0 END ),
   

      SQRT( ( 2 * SUM(CASE WHEN HEADER = 'F' THEN [BASE] ELSE 0 END ) * -- BASE1,
   SUM(CASE WHEN HEADER = 'T' THEN [BASE] ELSE 0 END ) )/ -- BASE2,
   SUM(CASE WHEN HEADER = 'K' THEN [BASE] ELSE 0 END ) ) --BASE3,
    + SUM( CASE WHEN HEADER = 'F' THEN [BASE] ELSE 0 END  ),


   SQRT( (2 * SUM(CASE WHEN HEADER = 'F' THEN [UPPER] ELSE 0 END ) *-- UPPER1,
   SUM(CASE WHEN HEADER = 'T' THEN [UPPER] ELSE 0 END ) )/ -- UPPER2,
   SUM(CASE WHEN HEADER = 'K' THEN [UPPER] ELSE 0 END ) ) -- UPPER3
    + SUM( CASE WHEN HEADER = 'F' THEN [BASE] ELSE 0 END )


 FROM
 (
  SELECT 0 [KEY], 'F' AS [HEADER] ,
    AVG( YEAR0_SUMAMT ) AS [AVG],
    SUM( CASE WHEN RIGHT(YYYYMM,2)= '01' THEN YEAR0_SUMAMT ELSE 0 END ) AS [BASE],
    MAX( YEAR0_SUMAMT ) AS [UPPER]
  FROM PLAN_RESULTS
  GROUP BY GIGUM_CODE
  UNION 
  SELECT 0, 'K', @OP, @OP, @OP
  UNION
  SELECT 0, 'T' AS [HEADER] ,
    AVG( YEAR0_SUMAMT ) * @OP2 AS [AVG],
    SUM( CASE WHEN RIGHT(YYYYMM,2)= '01' THEN YEAR0_SUMAMT ELSE 0 END ) * @OP2 AS [BASE],
    MAX( YEAR0_SUMAMT ) * @OP2 AS [UPPER]
  FROM PLAN_RESULTS
  GROUP BY GIGUM_CODE
 ) T
 GROUP BY [KEY]

 

 

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

[MS-SQL] 누적 계산에 사용한 쿼리...  (0) 2010.10.23
[MS-SQL] SELECT 쿼리..  (0) 2010.10.23
[MS-SQL] 피벗 ..  (0) 2010.08.24
하루 종일 쌩쑈하다.  (0) 2009.08.13
MS-SQL 에서의 한글 자음으로의 검색...  (0) 2009.06.26


간만에 쿼리 쓸라니 기억이 안나서 어렵군...

갑자기 피벗 쓸일이 있었는데... 가물 가물한 기억땜시롱...

간단한 예제로 써놓는답.

SELECT y, sum( case c when 'A' then i else 0 end ) AS AColumn ,sum( case A.c when 'B' then i else 0 end ) AS BColumn
FROM
(
 SELECT '200812' AS Y , 'A' AS C, '1' AS I
 UNION
 SELECT '200812', 'B', '2'
 )a
group by A.y


결과
Y           AColumn  BColumn
200812    1             2



Sum이 기억이 안나서 무진장 헤맸뉑...

CTE는 왜이리 어렵누..


추가 ~~~  : 반대로 할경우!!!


SELECT A.A, CASE B.[K]  WHEN 1 THEN A.[1]
      WHEN 2 THEN A.[2]
      WHEN 3 THEN A.[3]
      WHEN 4 THEN A.[4]
      WHEN 5 THEN A.[5] END AS M
FROM
(
 SELECT 'A' [A], 1 [1], 2 [2],3 [3],4 [4],5 [5]
)A
,
(
SELECT 1 K
UNION ALL
SELECT 2 K
UNION ALL
SELECT 3 K
UNION ALL
SELECT 4 K
UNION ALL
SELECT 5 K
)B