SQL Server 里怎样给相同属性的物料重新编序号?

comcyd 2017-11-14 01:55:24
用的【SQl Sever 2008】
一、情境:有一个表A:
A01(颜色) A02(排序号)
-----------------------------------------
红色
红色
白色
白色
白色
...

二、需求a:把颜色相同的都从0001开始编,要得到的效果是:
A01(颜色) A02(排序号)
-----------------------------------------
红色 0001
红色 0002
白色 0001
白色 0002
白色 0003
...
二、需求b:把颜色相同的都从字母A开始编(不会超26个字母),再得到如下效果:
A01(颜色) A02(排序号)
-----------------------------------------
红色 A
红色 B
白色 A
白色 B
白色 C
...
...全文
310 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
comcyd 2017-11-14
  • 打赏
  • 举报
回复
引用 3 楼 sinat_28984567 的回复:
--测试数据
if not object_id(N'Tempdb..#A') is null
	drop table #A
Go
Create table #A([A01] nvarchar(22),[A02] NVARCHAR(22))
Insert #A
select N'红色',null union all
select N'红色',null union all
select N'白色',null union all
select N'白色',null union all
select N'白色',null
Go
--测试数据结束
--1、
SELECT  A01 ,
        '000'
        + RTRIM(ROW_NUMBER() OVER ( PARTITION BY A01 ORDER BY GETDATE() )) AS A02
FROM    #A
--2、
SELECT  A01 ,
        CHAR(64+
        + RTRIM(ROW_NUMBER() OVER ( PARTITION BY A01 ORDER BY GETDATE() ))) AS A02
FROM    #A
太棒了!!
二月十六 2017-11-14
  • 打赏
  • 举报
回复
--测试数据
if not object_id(N'Tempdb..#A') is null
drop table #A
Go
Create table #A([A01] nvarchar(22),[A02] NVARCHAR(22))
Insert #A
select N'红色',null union all
select N'红色',null union all
select N'白色',null union all
select N'白色',null union all
select N'白色',null
Go
--测试数据结束
--1、
SELECT A01 ,
'000'
+ RTRIM(ROW_NUMBER() OVER ( PARTITION BY A01 ORDER BY GETDATE() )) AS A02
FROM #A
--2、
SELECT A01 ,
CHAR(64+
+ RTRIM(ROW_NUMBER() OVER ( PARTITION BY A01 ORDER BY GETDATE() ))) AS A02
FROM #A


wwfxgm 2017-11-14
  • 打赏
  • 举报
回复
drop TABLE IF EXISTS dbo.表A
create table 表A(id int IDENTITY,A01 varchar(20),A02 varchar(20))
INSERT INTO 表A(A01) VALUES('红色'),('红色'),('白色'),('白色'),('白色');
SELECT A01,format(row_number() over(partition by A01 ORDER BY (select 1)),'000') as A02 from dbo.表A
听雨停了 2017-11-14
  • 打赏
  • 举报
回复
第一个需求可以用row_number,第二个需求可以做一个对应表,1对A,2对B,一直到26对Z。然后用需求一得到的结果去连接这个表得到对应的ABCD
二月十六 2017-11-14
  • 打赏
  • 举报
回复
--测试数据
if not object_id(N'Tempdb..#A') is null
drop table #A
Go
Create table #A([A01] nvarchar(22),[A02] NVARCHAR(22))
Insert #A
select N'红色',null union all
select N'红色',null union all
select N'白色',null union all
select N'白色',null union all
select N'白色',null union all
select N'白色',null union all
select N'白色',null union all
select N'白色',null union all
select N'白色',null union all
select N'白色',null union all
select N'白色',null union all
select N'白色',null union all
select N'白色',null union all
select N'白色',null
Go
--测试数据结束
--1、
SELECT A01 ,
LEFT('000',4-LEN(RTRIM(ROW_NUMBER() OVER ( PARTITION BY A01 ORDER BY GETDATE() ))))
+ RTRIM(ROW_NUMBER() OVER ( PARTITION BY A01 ORDER BY GETDATE() )) AS A02
FROM #A


comcyd 2017-11-14
  • 打赏
  • 举报
回复
引用 3 楼 sinat_28984567 的回复:
--测试数据
if not object_id(N'Tempdb..#A') is null
	drop table #A
Go
Create table #A([A01] nvarchar(22),[A02] NVARCHAR(22))
Insert #A
select N'红色',null union all
select N'红色',null union all
select N'白色',null union all
select N'白色',null union all
select N'白色',null
Go
--测试数据结束
--1、
SELECT  A01 ,
        '000'
        + RTRIM(ROW_NUMBER() OVER ( PARTITION BY A01 ORDER BY GETDATE() )) AS A02
FROM    #A
--2、
SELECT  A01 ,
        CHAR(64+
        + RTRIM(ROW_NUMBER() OVER ( PARTITION BY A01 ORDER BY GETDATE() ))) AS A02
FROM    #A
你好,再请教一下,我这边数量一超过10个后就显示5位了,比如00010,00011,我只要四位,0010,0011,再怎么处理一下呢 谢谢了!

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧