我有一个查询,它对一些一般的分层数据进行一些完全联接。类别具有组,而组具有项目,尽管“组”和“项目”可能分别未附加到“类别”和“组”。我想要的结果如下所示:
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
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
最后一排和对1
在SIo
列的行与NULL
物品也可能是NULL
秒。不过,“孤儿项目”行上的I
和A
都很重要。
编辑:这是从实际代码简化的可读性。在我的情况下,项目可能有0个或多个子项,所以有可能是其中的价值观每个项目多行Co
,Go
和Io
只会被复制。不过,子项目没有编号,因此没有序数列。因此,一些完整行的示例如下所示:
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
我的问题是双重的:
这是在MS SQL Server 2012中。我只能访问SQL,因此T-SQL代码不可用。
作为参考,我的查询中的FROM
andWHERE
子句一起是大约20行代码,我想保留DRY。我以前使用过CTE,但不确定在这种情况下是否有用。
我对使用熟悉row_number over (order by...
,但是在这种情况下我看不到如何使用它。
对于组号,我相信你想要DENSE_RANK
。ROW_NUMBER
除组外,它的使用方法与相同。
没有看到您的真实代码,它将是这样的:
SELECT DENSE_RANK() over (ORDER BY Category) as Co,
Category,
DENSE_RANK() over (PARTITION BY Category, ORDER BY [Group]) as Go,
Group,
--etc
就是说,我不知道如何将数字转换为不带函数的数字/字母。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句