SQL Server sql表中的层次结构位于第100位[已关闭]

oyxsuwqo  于 2022-12-28  发布在  其他
关注(0)|答案(3)|浏览(181)

昨天关门了。
Improve this question
我的SQL表如下所示
| 装置_编号|姓名|交易方编号|
| - ------| - ------| - ------|
| 小行星1700|设施|000018727|
| 小行星1800|人力资源|000018728|
| 小行星18|专业人员|000092293|
| 一八零二|人力资源|000092294|
| 小行星1803|招募|000092295|
| 小行星1804|学习与发展|000092296|
| 一八零五|行政部门|零零零零零零七八三|
| 小行星1900|资讯科技|000018729|
| 小行星1901|资讯科技|000092297|
| 餐饮|餐饮|000045759|
| 产品。|产品|小行星000103719|
我想对上表做一个层次结构,其中1700、1800、1900 ...(在第100位)在第1级,而随后的1801、1802分别在第2级、第3级。
对此应该使用什么查询?我想向表中添加一个level列

7bsow1i6

7bsow1i61#

您可以按如下方式使用密集秩函数:
要使非数字值显示在层次级别的底部,请使用以下命令:

select *,
  dense_rank() over 
  (order by 
      case 
        when try_cast(unit_number as int) is null 
         then 1 else 0 
      end,
      isnull(try_cast(unit_number as int),99) % 100
  ) as h_level
from table_name

要使非数字值显示在层次级别的顶部,请使用以下命令:

select *,
  dense_rank() over 
  (order by 
      case 
        when try_cast(unit_number as int) is null 
         then 0 else 1
      end,
      isnull(try_cast(unit_number as int),1) % 100
  ) as h_level
from table_name

如果您想将not number值与(1700,1800,...)沿着放在第1级,请尝试以下操作:

select *,
  dense_rank() over 
  (order by isnull(try_cast(unit_number as int),0) % 100) as h_level
from table_name

See demo

ssgvzors

ssgvzors2#

您可以尝试以下操作:

UPDATE my_table
SET    my_new_col = 1
WHERE  unit_number LIKE '%00'

然后增加两个值,重复上述步骤。
这可以通过一个UPDATE中的一个更复杂的命令以及一些字符串操作和类型转换来完成,但听起来这将是一个一次性操作,所以我认为尝试这样做没有太大的价值。

jrcvhitl

jrcvhitl3#

听起来像是在寻找取模运算符:

/* Start Demo Data */
DECLARE @Units TABLE (Unit_Number NVARCHAR(10), Name NVARCHAR(50), Party_Number NVARCHAR(10), HierarchyLevel NVARCHAR(10))
INSERT INTO @Units (Unit_Number, Name, Party_Number) VALUES
('1700',      'Facilities            ', '000018727'),
('1800',      'Human Resource        ', '000018728'),
('1801',      'PRO                   ', '000092293'),
('1802',      'Human Resource        ', '000092294'),
('1803',      'Recruitment           ', '000092295'),
('1804',      'Learning & Development', '000092296'),
('1805',      'Administration        ', '000100783'),
('1900',      'Information Technology', '000018729'),
('1901',      'Information Technology', '000092297'),
('F&B',     'F&B'                   , '000045759'),
('PRODUCT.','Product'               , '000103719')
/* End Demo Data */

UPDATE @Units
   SET HierarchyLevel = COALESCE((TRY_CAST(Unit_Number AS INT) % 100),0) + 1
  FROM @Units

SELECT *
  FROM @Units
Unit_Number Name                    Party_Number    HierarchyLevel
------------------------------------------------------------------
1700        Facilities              000018727       1
1800        Human Resource          000018728       1
1801        PRO                     000092293       2
1802        Human Resource          000092294       3
1803        Recruitment             000092295       4
1804        Learning & Development  000092296       5
1805        Administration          000100783       6
1900        Information Technology  000018729       1
1901        Information Technology  000092297       2
F&B         F&B                     000045759       1
PRODUCT.    Product                 000103719       1

Modulo返回一个值除以指定值后的余数。在本例中,我们想知道Unit_Number除以100后的余数是多少。为了按照您的要求从索引为1的值开始,我们将其加1。
100返回0,+1:1 101返回1,+1:2
然后,我们只使用它来更新HeierarchyLevel列。
当您为此类问题提供演示数据时,以易于重用的格式提供演示数据非常有用,这样人们就可以快速解决您的问题。

相关问题