database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
Oracle
Informix
ㆍSybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Sybase Q&A 1787 게시물 읽기
No. 1787
쿼리 조언좀 부탁드립니다.
작성자
싸이베이스
작성일
2007-01-09 11:55
조회수
6,226


select col1 from table1

하면 ,


col1 (varchar(20))

2007-0001 

2007-0002 

2007-0003 

2007-0004 

2007-0005 

2007-0006 

2007-0007 

2007-0008 

2007-0009 

2007-0010 

2007-0011 

2007-0012 

2007-0013 


이런식으로 들어가있습니다. col1의 Data Type 은 varchar 이고요


제가 하고 싶은건, 현재년도(2007) 에 table1에 insert가 되면


2007-0014 를 만들어주는 쿼리를 알고 싶습니다.


앞에 4자리를 잘라서 올해것중에 뒤에4자리 max+1 이요!


만약에 2007 이 없다면, 2007-0001 이 되고요. 깔끔한 쿼리를 알고 싶습니다. 부탁드립니다.(__)


이 글에 대한 댓글이 총 4건 있습니다.

항상 좋은 자료만 보다가 글 하나 올리네요.....
허접한 프로스져를 만들어 보았습니다. ^^;

일반 syntax에서는 구현하기 힘들것 같습니다.
파라미터를 받고자 한다면 프로시져선언시 수정하시면 될 것 같습니다.

아니면 아래 프로시져를 그냥 쓰시면 됩니다.
(기본으로 test_t이라는 테이블이 있고, a(varchar(9))라는 항목이 있다고 가정합니다.)

- 아                            래 -                

create procedure sp_saicham
as
begin
declare @base_date char(4),
           @result_date char(4),
           @result_val1 char(4),
           @result_val2 char(4)    
set @base_date =  convert(char(4),getdate(),112)
select @result_date=left(a,4),
         @result_val1=max(right(a,4)),
         @result_val2=case char_length(convert(varchar,convert(int,max(right(a,4)))+1))
                     when 1 then '000'+convert(varchar,convert(int,max(right(a,4)))+1)
                   when 2 then '00'+convert(varchar,convert(int,max(right(a,4)))+1) 
                    when 3 then '0'+convert(varchar,convert(int,max(right(a,4)))+1)
                  else convert(varchar,convert(int,max(right(a,4)))+1) end 
from test_t
where left(a,4) in (
select max(distinct(left(a,4)))
from test_t )
group by left(a,4)

if convert(int,@base_date)>convert(int,@result_date)
execute ("insert into test_t values('"+@base_date+"-0001')")
else
execute ("insert into test_t values('"+@result_date+"-"+@result_val2+"')")
end   
              


이지아빠님이 2007-01-09 16:07에 작성한 댓글입니다.
이 댓글은 2007-01-09 16:09에 마지막으로 수정되었습니다. Edit

감사합니다.

싸이베이스님이 2007-01-10 11:38에 작성한 댓글입니다. Edit
프로시져가 아닌 쿼리로 한다면 아래와 같이 하면 되지 않을까 싶네요... 좀 부족하기는 하지만...;;
NULL 일 경우에는 (2007-0001)이 들어갑니다. 잠깐 자투리 시간에 만들어봤습니다.
자바 함수를 import 할 수 있는 환경이라면 오라클처럼 사용자 함수를 만들어서 쓰면 편하게 바꿀 수 있습니다. 허접하지만 혹시라도 참고가 될까해서..;;

select ISNULL(left(NULL,5),CONVERT(VARCHAR(4),GETDATE(),112)||'-')||
       CASE WHEN LEN(ISNULL(CONVERT(VARCHAR,MAX(CONVERT(NUMERIC,RIGHT(NULL,4)))+1),'1')) = 1 THEN '000'||ISNULL(CONVERT(VARCHAR,MAX(CONVERT(NUMERIC,RIGHT(NULL,4)))+1),'1')
            WHEN LEN(ISNULL(CONVERT(VARCHAR,MAX(CONVERT(NUMERIC,RIGHT(NULL,4)))+1),'1')) = 2 THEN '00'||ISNULL(CONVERT(VARCHAR,MAX(CONVERT(NUMERIC,RIGHT(NULL,4)))+1),'1')
            WHEN LEN(ISNULL(CONVERT(VARCHAR,MAX(CONVERT(NUMERIC,RIGHT(NULL,4)))+1),'1')) = 3 THEN '0'||ISNULL(CONVERT(VARCHAR,MAX(CONVERT(NUMERIC,RIGHT(NULL,4)))+1),'1')
       ELSE ISNULL(CONVERT(VARCHAR,MAX(CONVERT(NUMERIC,RIGHT(NULL,4)))+1),'1') END
권환희(fanijava)님이 2007-01-17 09:58에 작성한 댓글입니다.

호기심에 했다가...머리 뿌셔지는 줄 알았습니다.

Trigger로 해봤습니다.

create table tabl1( col1 varchar(20) null, col2 varchar(20))


create trigger tabl1_ins_tr on tabl1 for insert
 as
 
 declare @a varchar(20)
 declare @b varchar(20)
 declare @c varchar(20)
 declare @d varchar(20)
 declare @e varchar(20)
 select @a=convert(varchar(4),datepart(yy,getdate()))
 select @b=case
        when max(left(col1,4))  < @a
        then @a
        else max(left(col1,4))
        end from  tabl1
select @c=convert(varchar(4),convert(int,isnull(max(right(col1,4)),'0'))+1) from tabl1 where left(col1,4)=@b
select @d=case when datalength(@c)=1 then '000'+@c
                when datalength(@c)=2 then '00'+@c
                when datalength(@c)=3 then '0'+@c
                else @c end
select @e=@b+'-'+@d
update tabl1 set col1=@e from inserted a, tabl1 b where a.col2=b.col2



insert tabl1(col2) values("Left")

1> select * from tabl1
2> go
 col1                 col2
 -------------------- --------------------
 2005-0001            Insert
 2007-0001            Up
 2007-0002            Down
 2007-0003            Left



원래 이거 테스트 하려고 했던게 아니데...



지연님이 2007-01-17 17:53에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
1790다이나믹 컬럼의 fetch는 어떻게 해야 하나요 [4]
정완호
2007-01-10
9065
1789str_Replace 로 이게 가능한가요??? [1]
김철겸
2007-01-09
4931
1788versioning 에 관한 자료 좀 ..
정완호
2007-01-09
4441
1787쿼리 조언좀 부탁드립니다. [4]
싸이베이스
2007-01-09
6226
1786statistics 관련 질문 [1]
익명
2007-01-09
4695
1785ASE transaction log 와 truncate관련 [3]
이은영
2007-01-08
5583
178455억 데이타 테이블에 인덱스 설정 [4]
강원
2007-01-06
7165
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다