SQL分组序号,求高手帮助

nettt 2013-12-06 10:36:57


我要写一个sql实现图片中的最后一列的效果

根据前三列做group by,当提货地点+成品货权+发票抬头相同的时候生成“汇总号”相同,下一组则加1
我用ROW_NUMBER () OVER 无法实现
求高手帮助
...全文
111 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
唐诗三百首 2013-12-06
  • 打赏
  • 举报
回复
应是用dense_rank()实现.

create table net
(提货地点 varchar(20),成品货权 varchar(10),发票抬头 varchar(10),
 物料编号 varchar(20),数量 int,单位 varchar(5),价格 int)

insert into net
 select '济南成品库','1110','','ASRRM0001240K',3,'件',1300 union all
 select '济南成品库','1110','','ASRRM0002240K',1,'件',1000 union all
 select '济南成品库','1110','东天','ASRRM0001240K',2,'件',650 union all
 select '济南成品库','1110','东天','ASRRM0002240K',2,'件',1000 union all
 select '济南成品库','1110','昊海','ASRRM0001240K',1,'件',650 union all
 select '济南成品库','1110','昊海','ASRRM0002240K',1,'件',1000
 

with t as
(select *,
        dense_rank() over(order by 提货地点+成品货权+发票抬头) 'rn'
 from net)
select 提货地点,成品货权,发票抬头,物料编号,数量,单位,价格,
       replicate('0',2-len(rn))+rtrim(rn) '汇总号'
 from t

/*
提货地点                 成品货权    发票抬头     物料编号               数量         单位    价格          汇总号
-------------------- ---------- ---------- -------------------- ----------- ----- ----------- -----------
济南成品库                1110                  ASRRM0001240K        3           件     1300        01
济南成品库                1110                  ASRRM0002240K        1           件     1000        01
济南成品库                1110       东天         ASRRM0001240K        2           件     650         02
济南成品库                1110       东天         ASRRM0002240K        2           件     1000        02
济南成品库                1110       昊海         ASRRM0001240K        1           件     650         03
济南成品库                1110       昊海         ASRRM0002240K        1           件     1000        03

(6 row(s) affected)
*/
發糞塗牆 2013-12-06
  • 打赏
  • 举报
回复
有没有用partition by当提货地点,成品货权,发票抬头
nettt 2013-12-06
  • 打赏
  • 举报
回复
引用 1 楼 u010192842 的回复:
分组后ROW_NUMBER () OVER 插入到临时表。 然后在用这个表和临时表左连接,就OK了!
这样不行吧
Yole 2013-12-06
  • 打赏
  • 举报
回复
分组后ROW_NUMBER () OVER 插入到临时表。 然后在用这个表和临时表左连接,就OK了!
nettt 2013-12-06
  • 打赏
  • 举报
回复
引用 4 楼 ap0405140 的回复:
应是用dense_rank()实现.

create table net
(提货地点 varchar(20),成品货权 varchar(10),发票抬头 varchar(10),
 物料编号 varchar(20),数量 int,单位 varchar(5),价格 int)

insert into net
 select '济南成品库','1110','','ASRRM0001240K',3,'件',1300 union all
 select '济南成品库','1110','','ASRRM0002240K',1,'件',1000 union all
 select '济南成品库','1110','东天','ASRRM0001240K',2,'件',650 union all
 select '济南成品库','1110','东天','ASRRM0002240K',2,'件',1000 union all
 select '济南成品库','1110','昊海','ASRRM0001240K',1,'件',650 union all
 select '济南成品库','1110','昊海','ASRRM0002240K',1,'件',1000
 

with t as
(select *,
        dense_rank() over(order by 提货地点+成品货权+发票抬头) 'rn'
 from net)
select 提货地点,成品货权,发票抬头,物料编号,数量,单位,价格,
       replicate('0',2-len(rn))+rtrim(rn) '汇总号'
 from t

/*
提货地点                 成品货权    发票抬头     物料编号               数量         单位    价格          汇总号
-------------------- ---------- ---------- -------------------- ----------- ----- ----------- -----------
济南成品库                1110                  ASRRM0001240K        3           件     1300        01
济南成品库                1110                  ASRRM0002240K        1           件     1000        01
济南成品库                1110       东天         ASRRM0001240K        2           件     650         02
济南成品库                1110       东天         ASRRM0002240K        2           件     1000        02
济南成品库                1110       昊海         ASRRM0001240K        1           件     650         03
济南成品库                1110       昊海         ASRRM0002240K        1           件     1000        03

(6 row(s) affected)
*/
谢谢。

27,579

社区成员

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

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