t-sql需要层次数据的汇总视图

t-sql需要层次数据的汇总视图,sql,sql-server-2012,hierarchical-data,rollup,Sql,Sql Server 2012,Hierarchical Data,Rollup,我有一个sql server 2012表,如下所示: lvl | keywords -----|------------ A | null A1 | null A1.1 | red, green A1.2 | blue A1.3 | orange, yellow A2 | null A2.1 | brown A2.2 | black, purple B | null B1 | null B1.1 | pink B1.2 | velvet, orange B2 |

我有一个sql server 2012表,如下所示:

lvl  | keywords
-----|------------ 
A    | null
A1   | null
A1.1 | red, green
A1.2 | blue
A1.3 | orange, yellow
A2   | null
A2.1 | brown
A2.2 | black, purple
B    | null
B1   | null
B1.1 | pink
B1.2 | velvet, orange
B2   | null
B2.1 | cyan
B2.2 | purple, white
etc.
我需要一个视图,滚动到更高层次的关键字。因此,顶层A必须包含lvl列以A开头的基础记录中的所有关键字。层级A1应包含lvl列以A1开头的记录中的所有关键字,等等。因此,此视图的输出应如下所示:

lvl  | keywords
-----|------------ 
A    | red, green, blue, orange, yellow, brown, black, purple
A1   | red, green, blue, orange, yellow
A1.1 | red, green
A1.2 | blue
A1.3 | orange, yellow
A2   | brown, black, purple
A2.1 | brown
A2.2 | black, purple
B    | pink, velvet, orange, cyan, purple, white
B1   | pink, velvet, orange
B1.1 | pink
B1.2 | velvet, orange
B2   | cyan, purple, white
B2.1 | cyan
B2.2 | purple, white
etc.

如何在T-SQL中实现这一点?sql server 2012对于您提供的数据,这是一个基本的字符串连接:

select t.*,
       coalece(t.keywords,
               stuff( (select ', ' + t2.keywords
                       from t2
                       where t2.lvl like t.lvl + '%' and
                             t2.lvl <> t.lvl and
                             t2.keywords is not null
                       for xml path ('')
                      ), 1, 2, ''
                     )
               ) as keywords
from t;

不过,我要提醒您,将关键字存储在逗号分隔的字段中通常是一个非常糟糕的主意。你应该重新考虑你的数据结构。

你需要大量的字符串处理来完成这项工作。如果可以重新设计表,请为每个级别设置列。因此,您的表将有-Level1、Level2、Level3、关键字作为列。选择时,执行3个查询的并集-每个查询在每个级别对关键字进行分组。合并结果并在删除重复项后进行最终选择。谢谢,它可以工作,只需稍作调整:coalecet.lvl,应该是coalesct.keywords,为什么将关键字存储在逗号分隔的字段中是个坏主意?将使用分号;做个更好的熟食师?还是有其他原因?谢谢,罗布