Sql 如何将列值联接到一列中?
我有一个具有两列关系类型的表,并且与 与下面一样,我希望所有关系类型的值在lives中都有'T',列在一列中Sql 如何将列值联接到一列中?,sql,sql-server,Sql,Sql Server,我有一个具有两列关系类型的表,并且与 与下面一样,我希望所有关系类型的值在lives中都有'T',列在一列中 +------------+---------+ |relationship|liveswith| +------------+---------+ |A |T | +------------+---------+ |B |T | +------------+---------+ |C |F
+------------+---------+
|relationship|liveswith|
+------------+---------+
|A |T |
+------------+---------+
|B |T |
+------------+---------+
|C |F |
+------------+---------+
像这样
+------------+---------+
|T |F |
+------------+---------+
|A B |C |
+------------+---------+
我尝试使用Pivot,但它在T列中只给我一个值。我使用的是Microsoft SQL Server 2012您可以使用for xml路径(“”),并使用如下内容
create table data(relationship varchar(10),liveswith varchar(10));
insert into data values('A','T');
insert into data values('B','T');
insert into data values('C','F');
with temp_output
as (
SELECT a.liveswith
,STUFF((SELECT '-' + relationship
FROM data a1
WHERE a1.liveswith=a.liveswith
ORDER BY relationship
FOR XML PATH('')), 1, 1, '') AS listStr
FROM data a
GROUP BY a.liveswith
)
select max(case when liveswith='T' then liststr end) as 'T'
,max(case when liveswith='F' then liststr end) as 'F'
from temp_output
+-----+---+
| T | F |
+-----+---+
| A-B | C |
+-----+---+
您可以使用case语句关注true/false:
SELECT
string_agg(CASE WHEN liveswith THEN relationship ELSE '' END, ' ') AS T,
string_agg(CASE WHEN NOT liveswith THEN relationship ELSE '' END, ' ') AS F
FROM foobar;
输出:
t | f
------+-----
A B | C
有多少个
liveswith
的可能值?是T/F=True/False,还是其他原因?@TabAlleman它只有True和False,这与问题中所需的结果格式不同。@GeorgeJoseph你能解释一下合并所有内容的部分吗?我无法理解是的,我确实使用了with data()来模拟表。我已经更新了我的答案,使用create和insert来使用实际的表scripts@GeorgeJoseph哦,好的,谢谢,我明白了,这意味着我的表格我尝试了你的建议,但上面说string_agg未被识别为内置函数对不起,看起来它是在sql server 2017中实现的: