_대문 | 방명록 | 최근글 | 홈피소개 | 주인놈
FrontPage › 재귀쿼리를이용한Dumy테이블만들기

Contents

[-]
1 Hello World
2 1부터10까지생성
3 2000년01월01일~ 2000년12월31일까지만들기
4 달력
5 문자열(가로) -> 문자열(세로)
6 주민번호7자리로 나이 테이블 만들기


1 Hello World #

 cpp
#include <stdio.h>
int main()
{
        printf("Hello World!!\n");
        return 0;
}

2 1부터10까지생성 #

WITH Dumy(Seq)
AS
(
        SELECT 0 Seq
        UNION ALL
        SELECT Seq + 1 FROM Dumy
        WHERE Seq + 1 <= 10
)
SELECT Seq FROM Dumy
OPTION (MAXRECURSION 0);
--재귀횟수가 100을 초과할 경우는 OPTION (MAXRECURSION 0)를 붙여줘야 함.

with dumy
as
(
        select convert(binary(1), 0x01) bin
        union all
        select convert(binary(1), bin + 1) from dumy
        where bin + 1 <= 0xff
)
select bin, convert(tinyint, bin) num from dumy
option (maxrecursion 0);

3 2000년01월01일~ 2000년12월31일까지만들기 #

WITH temp(DT)
AS
(
        SELECT CONVERT(datetime, '20000101') DT 
        UNION ALL
        SELECT DT + 1 FROM temp
        WHERE DT + 1 < '20010101'
)
SELECT DT FROM temp
OPTION (MAXRECURSION 0);
--재귀횟수가 100을 초과할 경우는 OPTION (MAXRECURSION 0)를 붙여줘야 함.

4 달력 #

--누가 화면에서 달력 넣고 싶다고 조넨 귀찮게해서 만든거다.. ㅡㅡ;
DECLARE @DT datetime;
SET @DT = GETDATE();

WITH temp(DT)
AS
(
        SELECT DATEADD(mm, -2, @DT) DT 
        UNION ALL
        SELECT DT + 1 FROM temp
        WHERE DT + 1 < DATEADD(mm, 2, @DT)
)
SELECT
	MIN(YY) YY
,	MIN(MM) MM
,	ISNULL(MIN(CASE WHEN WD = 1 THEN DD END), '') 일
,	ISNULL(MIN(CASE WHEN WD = 2 THEN DD END), '') 월
,	ISNULL(MIN(CASE WHEN WD = 3 THEN DD END), '') 화
,	ISNULL(MIN(CASE WHEN WD = 4 THEN DD END), '') 수
,	ISNULL(MIN(CASE WHEN WD = 5 THEN DD END), '') 목
,	ISNULL(MIN(CASE WHEN WD = 6 THEN DD END), '') 금
,	ISNULL(MIN(CASE WHEN WD = 7 THEN DD END), '') 토
FROM (
	SELECT 
		DT 
	,	CONVERT(varchar, DATEPART(dd, DT)) DD
	,	DATEPART(mm, DT) MM
	,	DATEPART(yy, DT) YY
	,	DATEPART(weekday, DT) WD
	,	DATEPART(ww, DT) WW
	FROM temp
	WHERE DATEPART(mm, DT) = DATEPART(mm, @DT) 
--		IN 
--		(
--			DATEPART(mm, DATEADD(mm, -1, GETDATE()))
--		,	DATEPART(mm, DATEADD(mm, 1, GETDATE()))
--		,	DATEPART(mm, DATEADD(mm, 0, GETDATE()))
--		)
) T
GROUP BY
	WW, MM
ORDER BY 1, 2
OPTION (MAXRECURSION 0); 

5 문자열(가로) -> 문자열(세로) #

 Sql
Declare
	@Str VarChar(max);
Select
	@Str='This is a test...';

With Parse as
(
	Select
		SubString(@Str,1,1)[Chr],
		1[Idx]
	Union All
	Select
		SubString(@Str,Idx+1,1),
		Idx+1
	from Parse
	where (Idx+1)<=Len(@Str)
)
Select
	*
from Parse
option (MaxRecursion 0);

6 주민번호7자리로 나이 테이블 만들기 #

 Sql
WITH temp(DT)
AS
(
        SELECT CONVERT(datetime, '18000101') DT 
        UNION ALL
        SELECT DT + 1 FROM temp
        WHERE DT + 1 < CONVERT(char(8), GETDATE(), 112)
)
SELECT
	DT
,	Birth7
,	CASE WHEN Age < 0 THEN 0 ELSE Age END -
	CASE WHEN SUBSTRING(Birth7, 3, 4) >= SUBSTRING(CONVERT(char(8), GETDATE(), 112), 5, 4) THEN 1 ELSE 0 END Age
FROM (
	SELECT 
		DT
	,	CASE 
			WHEN DT >= '20000101' THEN RIGHT(CONVERT(char(8), DT, 112), 6) + CONVERT(char(1), T.Gender + 2)
			WHEN DT <  '19000101' THEN RIGHT(CONVERT(char(8), DT, 112), 6) + CONVERT(char(1), RIGHT(T.Gender + 8, 1))
			ELSE RIGHT(CONVERT(char(8), DT, 112), 6) + CONVERT(char(1), T.Gender + 0)
		END Birth7
	,	DATEDIFF(yy, DT, CONVERT(char(8), GETDATE()-1, 112)) Age
	FROM temp
		CROSS JOIN (SELECT 1 Gender UNION ALL SELECT 2) T
) T
OPTION (MAXRECURSION 0);

댓글 남기기..
이름: : 오른쪽의 새로고침을 클릭해 주세요. 새로고침
EditText : Print : Mobile : FindPage : DeletePage : LikePages : Powered by MoniWiki : Last modified 2018-04-13 23:12:53

인생은 교향악입니다. 인생의 각 순간들이 합창으로 노래하고 있습니다. (R.롤랑)