【问题标题】:t-sql need a rollup view from hierarchal datat-sql 需要来自分层数据的汇总视图
【发布时间】:2017-12-20 08:35:00
【问题描述】:

我有一个如下所示的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)

【问题讨论】:

  • 你需要大量的字符串处理来完成这个。如果您可以重新设计表格,请为每个级别设置列。因此,您的表格将具有 - Level1、Level2、Level3、Keywords 作为列。选择时,执行 3 个查询的联合 - 每个查询都在每个级别分组关键字。合并结果并在删除重复项后进行最终选择。

标签: sql sql-server-2012 hierarchical-data rollup


【解决方案1】:

对于您提供的数据,这是一个基本的字符串连接:

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;

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

【讨论】:

  • 谢谢,它可以工作,稍作调整:coalece(t.lvl, should be coalesce(t.keywords, 为什么将关键字存储在逗号分隔的字段中是个坏主意?半冒号;做一个更好的分隔符?还是有其他原因?谢谢,Rob
猜你喜欢
  • 2016-07-26
  • 2017-09-14
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多