Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL结果中的分层编号_Sql_Sql Server - Fatal编程技术网

SQL结果中的分层编号

SQL结果中的分层编号,sql,sql-server,Sql,Sql Server,我有一个查询,它对一些一般层次结构的数据进行了一些完全联接。类别有组,组有项目,但组和项目可以分别独立于类别和组。我想要的结果如下所示: I. NULL A. NULL 1. Item Orphan <-- no category or group B. Group Red <-- no category 1. Item Apple 2. Item Banana II. Category Bacon A. Group Blue B. Group

我有一个查询,它对一些一般层次结构的数据进行了一些完全联接。类别有组,组有项目,但组和项目可以分别独立于类别和组。我想要的结果如下所示:

I. NULL
  A. NULL
    1. Item Orphan <-- no category or group
  B. Group Red <-- no category
    1. Item Apple
    2. Item Banana
II. Category Bacon
  A. Group Blue
  B. Group Taupe
    1. Item Kiwi
    2. Item Watermelon
III. Category Atari
  A. Group Silver
IV. Category Maui
...
Category Group  Item
NULL     NULL   Orphan
NULL     Red    Apple
NULL     Red    Banana
Bacon    Blue   NULL
Bacon    Taupe  Kiwi
Bacon    Taupe  Watermelon
Atari    Silver NULL
Maui     NULL   NULL
Co  Category Go Group  Io Item       Supplier  Supplier_phone
I   NULL     B  Red    2  Banana     NULL      NULL
II  Bacon    B  Taupe  1  Kiwi       Steve     555-1234
II  Bacon    B  Taupe  1  Kiwi       Sally     555-4242
II  Bacon    B  Taupe  2  Watermelon NULL      NULL
我需要的是:

Co  Category Go Group  Io Item
I   NULL     A  NULL   1  Orphan
I   NULL     B  Red    1  Apple
I   NULL     B  Red    2  Banana
II  Bacon    A  Blue   1  NULL
II  Bacon    B  Taupe  1  Kiwi
II  Bacon    B  Taupe  2  Watermelon
III Atari    A  Silver 1  NULL
IV  Maui     A  NULL   1  NULL
尽管如此,最后一行上的
A
Io
列中的
1
s以及
NULL
项目行上的
NULL也可以是
s。不过,孤立项行上的
I
A
很重要

编辑:这是从实际代码简化为可读性。在我的例子中,项目可能有0个或多个子项目,因此每个项目可能有多行,
Co
Go
Io
的值将简单地复制。但是子项没有编号,因此它们没有序号列。因此,一些整行的示例如下所示:

I. NULL
  A. NULL
    1. Item Orphan <-- no category or group
  B. Group Red <-- no category
    1. Item Apple
    2. Item Banana
II. Category Bacon
  A. Group Blue
  B. Group Taupe
    1. Item Kiwi
    2. Item Watermelon
III. Category Atari
  A. Group Silver
IV. Category Maui
...
Category Group  Item
NULL     NULL   Orphan
NULL     Red    Apple
NULL     Red    Banana
Bacon    Blue   NULL
Bacon    Taupe  Kiwi
Bacon    Taupe  Watermelon
Atari    Silver NULL
Maui     NULL   NULL
Co  Category Go Group  Io Item       Supplier  Supplier_phone
I   NULL     B  Red    2  Banana     NULL      NULL
II  Bacon    B  Taupe  1  Kiwi       Steve     555-1234
II  Bacon    B  Taupe  1  Kiwi       Sally     555-4242
II  Bacon    B  Taupe  2  Watermelon NULL      NULL
我的问题有两个:

  • 如何为层次结构的每个级别进行不同的编号,并在该级别更改时使其递增
  • 如何将这些数字转换为不同的顺序空间(例如,将1、2、3转换为a、b、c或I、II、III),并按级别进行转换
这是在MS SQL Server 2012中。我只能访问SQL,所以T-SQL代码已经过时了

作为参考,我查询中的
FROM
WHERE
子句共有大约20行代码,我希望保持干燥。我以前使用过CTE,但我不确定这在这种情况下是否有用


我熟悉使用
row\u number over(order by…
),但我不知道如何在这种情况下使用它。

对于组号,我相信您需要
密集排列
。它的使用方式与
row\u number
相同,除了组

在看不到真实代码的情况下,它将类似于:

SELECT    DENSE_RANK() over (ORDER BY Category) as Co,
          Category,
          DENSE_RANK() over (PARTITION BY Category, ORDER BY [Group]) as Go,
          Group,
          --etc

也就是说,我不知道如何在没有函数的情况下将数字转换为数字/字母。

在层次结构中永远不会有低于
项的级别?我从实际用例中简化了它,但确实会有。我会更新问题以反映这一点。这是一个好的决定,因为这感觉就像是一个可以产生重大影响的问题很大的不同。谢谢!我以前在复制/粘贴/修改中使用的
行数
代码中没有真正掌握不同的关键字。现在我终于明白了
划分和
排序以及在
密集等级
中做了什么。至于转换,我想我可以在消耗查询结果,但如果必须,我可能会使用
CASE
语句在有限范围内得到一些糟糕的翻译,如果必须的话:再次感谢。@jinglesthula很高兴这有帮助,那些“aha”时刻是最好的。我非常希望翻译在代码中可以管理,因为我不希望这些情况发生对任何人的提示:D祝你好运。谢谢。我能够翻译代码中的罗马数字(谢天谢地!)。为了避免任何人使用谷歌搜索,我编写的罗马数字算法就是其中的一个端口