日期:2014-05-18  浏览次数:20507 次

请教一个问题SQL的问题,谢谢
SQL code

测试数据
/*ID    日期    客户名称    流水单号
int(主键)    datetime    varchar(100)    varchar(20)
1    2012/7/18     东莞港有限公司广州分公司    
2    2012/7/18     佛山彤鞋业有限公司    
3    2012/7/18     佛山彤鞋业有限公司    
4    2012/7/18     佛山彤鞋业有限公司    
5    2012/7/18     广东发克汽车用品有限公司    
6    2012/7/18     广东发克汽车用品有限公司    
7    2012/7/18     广东发克汽车用品有限公司    
8    2012/7/18     广东发克汽车用品有限公司    
9    2012/7/18     广东发克汽车用品有限公司    
10    2012/7/18     广州南大酒店有限公司    
11    2012/7/18     广州南大酒店有限公司    
12    2012/7/18     河源市源区宇华印刷厂    
13    2012/7/18     河源市源区宇华印刷厂    
14    2012/7/18     河源市源区宇华印刷厂    
15    2012/7/18     河源市源区宇华印刷厂
16    2012/7/18     河源市源区宇华印刷厂
17    2012/7/18     河源市源区宇华印刷厂
18    2012/7/18     河源市源区宇华印刷厂 */

根据相同的客户名称生成一样的流水单号(格式:DH+年+月+日+三位流水:DH120719001),需要考虑当天产生的最大流水单号在向上面累加;得出如果结果
/*
ID    日期    客户名称    流水单号
int(主键)    datetime    varchar(100)    varchar(20)
1    2012/7/18     东莞港有限公司广州分公司    DH120719001
2    2012/7/18     佛山彤鞋业有限公司    DH120719002
3    2012/7/18     佛山彤鞋业有限公司    DH120719002
4    2012/7/18     佛山彤鞋业有限公司    DH120719002
5    2012/7/18     广东发克汽车用品有限公司    DH120719003
6    2012/7/18     广东发克汽车用品有限公司    DH120719003
7    2012/7/18     广东发克汽车用品有限公司    DH120719003
8    2012/7/18     广东发克汽车用品有限公司    DH120719003
9    2012/7/18     广东发克汽车用品有限公司    DH120719003
10    2012/7/18     广州南大酒店有限公司    DH120719004
11    2012/7/18     广州南大酒店有限公司    DH120719004
12    2012/7/18     河源市源区宇华印刷厂    DH120719005
13    2012/7/18     河源市源区宇华印刷厂    DH120719005
14    2012/7/18     河源市源区宇华印刷厂    DH120719005
15    2012/7/18     河源市源区宇华印刷厂    DH120719005
16    2012/7/18     河源市源区宇华印刷厂    DH120719005
17    2012/7/18     河源市源区宇华印刷厂    DH120719005
18    2012/7/18     河源市源区宇华印刷厂    DH120719005 */




就这么多分了.

------解决方案--------------------
我怎么感觉不是 19 呢?是 18 ?

SQL code

;with cte as
(
    select 日期,客户,'DH'+right(convert(varchar(10)),8)+
         right(1001+row_number() over (order by getdate()),3) as 流水号
    from tb
    group by 日期,客户
)

select *
from tb a join cte b on a.日期 = b.日期 and a.客户 = b.客户

------解决方案--------------------
TRY

SQL code
UPDATE TB SET 流水单号=B.流水单号 FROM 
(select [客户名称 ],('DH'+RIGHT(CONVERT(VARCHAR(8),[日期],112),4)+RIGHT(CONVERT(VARCHAR(4),(1000+rn)),3))流水单号
FROM (
select ROW_NUMBER() over(partition by [客户名称 ] order by [客户名称 ])rn,[日期],[客户名称 ] from tb)AS A)B ON TB.[客户名称 ]=B.[客户名称 ]

------解决方案--------------------
SQL code
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([ID] varchar(9),[日期] datetime,[客户名称] varchar(24),[流水单号] varchar(11))
insert [tb]
select '1','2012/7/18','东莞港有限公司广州分公司',null union all
select '2','2012/7/18','佛山彤鞋业有限公司',null union all
select '3','2012/7/18','佛山彤鞋业有限公司',null union all
select '4','2012/7/18','佛山彤鞋业有限公司',null union all
select '5','2012/7/18','广东发克汽车用品有限公司',null union all
select '6','2012/7/18','广东发克汽车用品有限公司',null union all
select '7','2012/7/18','广东发克汽车用品有限公司',null union all
select '8','2012/7/18','广东发克汽车用品有限公司',null union all
select '9','2012/7/18','广东发克汽车用品有限公司',null union all
select '10','2012/7/18','广州南大酒店有限公司',null union all
select '11','2012/7/18','广州南大酒店有限公司',null union all
select '12','2012/7/18','河源市源区宇华印刷厂',null union all
select '13','2012/7/18','河源市源区宇华印刷厂',null union all
select '14','2012/7/18','河源市源区宇华印刷厂',null union all
select '15','2012/7/18','河源市源区宇华印刷厂',null union all
select '16','2012/7/18','河源市源区宇华印刷厂',null union all
select '17','2012/7/18','河源市源区宇华印刷厂',null union all
select '18','2012/7/18','河源市源区宇华印刷厂',null
go

UPDATE A
SET A.流水单号=B.BH
FROM TB A
JOIN 
(SELECT *,
  BH='DH'+stuff(CONVERT(VARCHAR(8),日期,112),1,2,'')+right('000'+ltrim(DENSE_RANK() OVER(partition by CONVERT(VARCHAR(8),日期,112) order by 客户名称)),3)