SQL RANK() 产生序号 、 ROW_NUMBER()、 DENSE_RANK() 生成分组内行序号

查询使用了三个 ROW_NUMBER() 分别生成行号,两个组内序号

一个简单的例子
反回数据库中用户表的列表
使用 ROW_NUMBER() 生成行号( rowunm ),行号以表名排序

-- 例如:查看用户表
-- 以表名称排序生成行号
SELECT ROW_NUMBER() OVER( ORDER BY name ) as rowunm 
    ,name as ctablename 
FROM sysobjects 
WHERE xtype = 'U' 
order by name 

-- 1/8 1411 计件单统计表 返回结果前,生成统计表保存由SQL临时库, 与1400软件逻辑相同
-- 生成一个表计件表
-- 以单价分组
--, gd_js.部门编号,gd_js.部门名称,gd_js.部门全名,gd_js.员工编号,gd_js.姓名
 --  gd_jm.日期, gd_jm.日
 

select ROW_NUMBER() over (partition by gd_jm.年 order by gd_jm.年 ) as 行号 
  
  , gd_jm.工资表编号 , gd_jm.年 ,  gd_jm.年月, gd_jm.月 , gd_jm.季
  , gd_js.批号,gm_ph.产品编号
  ,ROW_NUMBER() over( partition by gd_jm.工资表编号, gd_jm.年 , gd_jm.年月,gd_jm.月 , gd_jm.季, gd_js.批号
                             
                              order by gd_jm.工资表编号, gd_jm.年 , gd_jm.年月,gd_jm.月 , gd_jm.季, gd_js.批号 ) as 产品分组序号
               

  , gm_ph.产品名称,gd_js.工序编号,gm_jml.工序名称
  , ROW_NUMBER() over( partition by gd_jm.工资表编号, gd_jm.年 , gd_jm.年月,gd_jm.月 , gd_jm.季
                             , gd_js.批号, gm_ph.产品编号, gm_ph.产品名称, gd_js.工序编号, gm_jml.工序名称
                              order by gd_js.单价 ) as 序号
                              

  , sum(gd_js.金额) as 金额, sum(gd_js.数量) as  数量, gd_js.单价 as 单价
-- into  tempdb.dbo.temp_cursor_gd_js_sum_5QY0U821V_1
from gd_js inner join gd_jm
   on gd_js.计件单主表序号 = gd_jm.计件单主表序号
   left join gm_jml
   on gd_js.工序编号 = gm_jml.工序编号
   left join gm_ph
   on gd_js.批号 = gm_ph.批号
   
where gd_jm.工资表编号 like  '2020-01'
            and gd_js.部门编号 like '%%'
            and gd_js.员工编号 like '%%' 
            and gd_js.工序编号 in ('101','102','103','104','100','105','106','107')
 group by    gd_jm.工资表编号, gd_jm.年 , gd_jm.年月,gd_jm.月 , gd_jm.季
                             , gd_js.批号, gm_ph.产品编号, gm_ph.产品名称, gd_js.工序编号, gm_jml.工序名称,gd_js.单价

 ORDER BY gd_jm.工资表编号,gd_jm.年月
                      ,gd_js.批号,gm_ph.产品名称,gd_js.工序编号,gm_jml.工序名称

			
 --',N'@P1 varchar(7),@P2 varchar(2),@P3 varchar(2)',,,

RANK() 生成序号 如果排列出现重复 会跳号

-- 1/8 1411 计件单统计表 返回结果前,生成统计表保存由SQL临时库, 与1400软件逻辑相同
-- 生成一个表计件表
-- 以单价分组
--, gd_js.部门编号,gd_js.部门名称,gd_js.部门全名,gd_js.员工编号,gd_js.姓名
 --  gd_jm.日期, gd_jm.日
 

select ROW_NUMBER() over (partition by gd_jm.年 order by gd_jm.年 ) as 行号 
  
  , gd_jm.工资表编号 , gd_jm.年 ,  gd_jm.年月, gd_jm.月 , gd_jm.季
  , gd_js.批号,gm_ph.产品编号
  , RANK() over( order by gm_ph.产品编号 ) as 产品序号
  , ROW_NUMBER() over( partition by gd_jm.工资表编号, gd_jm.年 , gd_jm.年月,gd_jm.月 , gd_jm.季, gd_js.批号
                             
                              order by gd_jm.工资表编号, gd_jm.年 , gd_jm.年月,gd_jm.月 , gd_jm.季, gd_js.批号 ) as 产品组内序号
               

  , gm_ph.产品名称,gd_js.工序编号,gm_jml.工序名称
  , ROW_NUMBER() over( partition by gd_jm.工资表编号, gd_jm.年 , gd_jm.年月,gd_jm.月 , gd_jm.季
                             , gd_js.批号, gm_ph.产品编号, gm_ph.产品名称, gd_js.工序编号, gm_jml.工序名称
                              order by gd_js.单价 ) as 分组序号
                              

  , sum(gd_js.金额) as 金额, sum(gd_js.数量) as  数量, gd_js.单价 as 单价
-- into  tempdb.dbo.temp_cursor_gd_js_sum_5QY0U821V_1
from gd_js inner join gd_jm
   on gd_js.计件单主表序号 = gd_jm.计件单主表序号
   left join gm_jml
   on gd_js.工序编号 = gm_jml.工序编号
   left join gm_ph
   on gd_js.批号 = gm_ph.批号
   
where gd_jm.工资表编号 like  '2020-01'
            and gd_js.部门编号 like '%%'
            and gd_js.员工编号 like '%%' 
            and gd_js.工序编号 in ('101','102','103','104','100','105','106','107')
 group by    gd_jm.工资表编号, gd_jm.年 , gd_jm.年月,gd_jm.月 , gd_jm.季
                             , gd_js.批号, gm_ph.产品编号, gm_ph.产品名称, gd_js.工序编号, gm_jml.工序名称,gd_js.单价
ORDER BY 9
-- ORDER BY gd_jm.工资表编号,gd_jm.年月
 --                     ,gd_js.批号,gm_ph.产品名称,gd_js.工序编号,gm_jml.工序名称

			
 --',N'@P1 varchar(7),@P2 varchar(2),@P3 varchar(2)',,,

DENSE_RANK() 不发生跳号

-- 1/8 1411 计件单统计表 返回结果前,生成统计表保存由SQL临时库, 与1400软件逻辑相同
-- 生成一个表计件表
-- 以单价分组
--, gd_js.部门编号,gd_js.部门名称,gd_js.部门全名,gd_js.员工编号,gd_js.姓名
 --  gd_jm.日期, gd_jm.日
 

select ROW_NUMBER() over (partition by gd_jm.年 order by gd_jm.年 ) as 行号 
  
  , gd_jm.工资表编号 , gd_jm.年 ,  gd_jm.年月, gd_jm.月 , gd_jm.季
  , gd_js.批号,gm_ph.产品编号
  , DENSE_RANK() over( order by gm_ph.产品编号 ) as 产品序号1
  , RANK() over( order by gm_ph.产品编号 ) as 产品序号2
  , ROW_NUMBER() over( partition by gd_jm.工资表编号, gd_jm.年 , gd_jm.年月,gd_jm.月 , gd_jm.季, gd_js.批号
                             
                              order by gd_jm.工资表编号, gd_jm.年 , gd_jm.年月,gd_jm.月 , gd_jm.季, gd_js.批号 ) as 产品组内序号
               

  , gm_ph.产品名称,gd_js.工序编号,gm_jml.工序名称
  , ROW_NUMBER() over( partition by gd_jm.工资表编号, gd_jm.年 , gd_jm.年月,gd_jm.月 , gd_jm.季
                             , gd_js.批号, gm_ph.产品编号, gm_ph.产品名称, gd_js.工序编号, gm_jml.工序名称
                              order by gd_js.单价 ) as 分组序号
                              

  , sum(gd_js.金额) as 金额, sum(gd_js.数量) as  数量, gd_js.单价 as 单价
-- into  tempdb.dbo.temp_cursor_gd_js_sum_5QY0U821V_1
from gd_js inner join gd_jm
   on gd_js.计件单主表序号 = gd_jm.计件单主表序号
   left join gm_jml
   on gd_js.工序编号 = gm_jml.工序编号
   left join gm_ph
   on gd_js.批号 = gm_ph.批号
   
where gd_jm.工资表编号 like  '2020-01'
            and gd_js.部门编号 like '%%'
            and gd_js.员工编号 like '%%' 
            and gd_js.工序编号 in ('101','102','103','104','100','105','106','107')
 group by    gd_jm.工资表编号, gd_jm.年 , gd_jm.年月,gd_jm.月 , gd_jm.季
                             , gd_js.批号, gm_ph.产品编号, gm_ph.产品名称, gd_js.工序编号, gm_jml.工序名称,gd_js.单价
ORDER BY 9
-- ORDER BY gd_jm.工资表编号,gd_jm.年月
 --                     ,gd_js.批号,gm_ph.产品名称,gd_js.工序编号,gm_jml.工序名称

			
 --',N'@P1 varchar(7),@P2 varchar(2),@P3 varchar(2)',,,

NTILE()排序 分成多少组进行排序,
NTILE()OVER(ORDER BY COLUMNNAME)

select NTILE(2)over(order by name),* from #Tmp  -- 把人员分为两组 
select NTILE(3)over(order by name),* from #Tmp  -- 把人员分为三组

你可能感兴趣的:(SQL)