在结果的同一行中显示同一列和同一表的 3 个不同值

Posted

技术标签:

【中文标题】在结果的同一行中显示同一列和同一表的 3 个不同值【英文标题】:Show 3 different values of the same column and same table in the same row in results 【发布时间】:2019-05-27 18:54:25 【问题描述】:

我的项目使用 SQL Server 2014。我有三张桌子:

Table A: 
Column: id
Table B:
Column: id, id_of_Table_A
Table C:
Column: id, id_of_Table_B, category

The relationship between A and B is one to many
The relationship between B and C is one to many

在表 C 中,category 列有 10 个类别值,但我只对三个类别(cat1、cat2、cat3)感兴趣。我希望对这三个类别进行查询并产生以下结果:

id_of_Table_A, category, category, category

我有如下声明:

select a.id, c.category from Table_C c 
join Table_B b on b.id = c.id_of_Table_B
join Table_A a on a.id = b.id_of_Table_A
where c.category = 'cat1' and a.id in (1, 2, 3)

但是这个语句只列出了

id_of_Table_A, cat1

其中仅包含给定 id_of_Table_A 的 cat1。我希望有类似的东西:

1, cat1, cat2, cat3

如果表 C 中存在 cat1、cat2 和 cat3 对于表 A 中给定的 id 1

如果单个语句无法产生所需的结果,那么存储过程是可以的。

更新

在以下示例结果中,

1, cat1, cat2, cat3

cat1、cat2、cat3 必须来自表 B 中的三个不同记录。假设我们有这些表和行:

Table A: 1,2
Table B: (1,1), (2,1), (3,1), (4,2), (5,2), (6,2)
Table c: (1,1,'cat3'), (2,2,'cat1'), (3,3,'cat2'), (4,4,'cat1'), (5,5,'cat4'), (6,6,'cat2')

那么预期的结果应该是:

1, cat1, cat2, cat3

基本上,表的关系形成一棵树。我希望在从根开始的非重叠路径上找到叶子为 cat1、cat2 和 cat3 的根(表 A)。

【问题讨论】:

样本数据最好使用DDL + DML。请edit您的问题包括它。更多详情,read this. where c.category = 'cat1' 表示你只对cat1感兴趣。 这只是一个例子。我无法编写查询以在结果中生成 cat2 和 cat3。 【参考方案1】:

您可以将id_of_b 的所有类别组合成一个xml 值,然后在列中显示类别。像这样。

declare @a table(id int)
declare @b table(id int,id_of_a int)
declare @c table(id int,id_of_b int,category varchar(50))
insert @a values(1),(2)
insert @b values(1,1),(2,1),(3,2)
insert @c values(1,1,'cat1'),(2,1,'cat2'),(3,1,'cat3'),(4,2,'cat4')
;with cte as(
  select a.id,
    cast((select category from @c c where c.id_of_b = b.id for xml auto,root,type) as xml) xcat
  from @a a inner join @b b on a.id = b.id_of_a
)
select id,
  t.v.value('c[1]/@category','varchar(50)') cat1,
  t.v.value('c[2]/@category','varchar(50)') cat2,
  t.v.value('c[3]/@category','varchar(50)') cat3
from cte
cross apply xcat.nodes('root') t(v)

更新问题的更新答案

declare @a table(id int)
declare @b table(id int,id_of_a int)
declare @c table(id int,id_of_b int,category varchar(50))
insert @a values(1),(2)
insert @b values (1,1), (2,1), (3,1), (4,2), (5,2), (6,2)
insert @c values (1,1,'cat3'), (2,2,'cat1'), (3,3,'cat2'), (4,4,'cat1'), (5,5,'cat4'), (6,6,'cat2')

;with cte as(
  select a.id,
    cast((select category from @c c inner join @b b on c.id_of_b = b.id 
       where b.id_of_a=a.id
       for xml auto,root,type) as xml) xcat
  from @a a 
)
select id,
  t.v.value('c[1]/@category','varchar(50)') cat1,
  t.v.value('c[2]/@category','varchar(50)') cat2,
  t.v.value('c[3]/@category','varchar(50)') cat3
from cte
cross apply xcat.nodes('root') t(v)

【讨论】:

嗨,Alex,;with cte as... 似乎存在语法错误。 Management Studio 指示存在错误。 Management Studio 中仍然收到错误消息。语法错误。 消息是什么? Msg 102,级别 15,状态 1,第 14 行。')' 附近的语法不正确。 感谢您的更新。示例正在运行,但结果不是我预期的。我很抱歉帖子不够清楚。请查看我更新的帖子。

以上是关于在结果的同一行中显示同一列和同一表的 3 个不同值的主要内容,如果未能解决你的问题,请参考以下文章

如何使通过公共相关 ID 链接的变量显示在 Splunk 表的同一行上?

在Ruby中的同一行中打印不同大小数组的数组元素

如何在 SQL 中显示来自 3 个不同表的多个列?

加入表两次 - 在同一个表的两个不同列上

同一表的不同列的计数总和

如何把A表中X行的数值引进B表的X列,2个表的数值相同,但版面不同,A表显示为行项,B表显示为列项