Sql 在逗号分隔的列表末尾添加“and”
目前,我正在使用stuff函数为每行创建一个逗号分隔的列表 x、 y,z 我想为列表中的n-1项添加逗号,最后一项前面加上“and” x、 y和z 出于这些目的,仅仅检查行号是行不通的,因为这个列表是根据唯一Id生成的,因此我不能只迭代到表的末尾。代码如下:Sql 在逗号分隔的列表末尾添加“and”,sql,sql-server,tsql,Sql,Sql Server,Tsql,目前,我正在使用stuff函数为每行创建一个逗号分隔的列表 x、 y,z 我想为列表中的n-1项添加逗号,最后一项前面加上“and” x、 y和z 出于这些目的,仅仅检查行号是行不通的,因为这个列表是根据唯一Id生成的,因此我不能只迭代到表的末尾。代码如下: SELECT DISTINCT (sw.OwnerID) ,stuff(( SELECT DISTINCT ', ' + e.pn FROM fct.e
SELECT DISTINCT (sw.OwnerID)
,stuff((
SELECT DISTINCT ', ' + e.pn
FROM fct.enrtablev e
WHERE sw.OwnerID = e.OwnerId
FOR XML PATH('')), 1, 1, '') AS [Pet(s)]
有点像黑客。。。如果2017年,string_agg将更适合+
在这里,我们使用测试项目计数sum1的行数,当该行数等于时,这是列表中的最后一个项目
范例
返回
XQUery和XML数据模型基于有序序列。这正是我们需要的 下面是一个基于XQuery及其FLWOR表达式的简单解决方案 SQL 输出
您可以使用orderby和count来实现这一点 声明@YourTable table OwnerID int,pn varchar50 在@YourTable值中插入 1,'X' ,1,'Y' ,1,'Z' ,2,“苹果” ;与CTE_所有者一样 选择ownerid、pn、order by ownerid上的行号作为totalrn, count*按ownerid超额分配按ownerid排序为ownercnt 从@yourtable 选择不同的所有者ID, 东西 当c.totalrn=c.ownercnt时,选择“,”+大小写,然后选择CONCAT“和”,c.pn else c.pn end 来自CTE_所有者,作为c 其中c.OwnerID=o.OwnerID c.totalrn订购 对于XML路径1,1,作为[Pets] 从@yourtable作为o 所有者 宠物 1. 十、 Y和Z 2. 苹果
你有什么选择?尝试被卡住了?顺便说一句,你不应该在任何地方随意使用nolock。我可能会在leadpn over order by pn为null时使用这个用例me@Charlieface既然你提到了。。。是的。这只是我的第一个想法,而且被放大了。
Declare @YourTable table (OwnerID int,pn varchar(50))
Insert Into @YourTable values
(1,'X')
,(1,'Y')
,(1,'Z')
,(1,'Z')
,(2,'Apples')
Select Distinct
OwnerID
,stuff( ( Select case when row_number() over(order by pn) = nullif(sum(1) over() ,1)
then ', and '
else ', '
end + pn
FROM (Select distinct pn
From @YourTable
Where OwnerID = A.OwnerId
) e
Order By PN
For XML Path('')), 1, 2, '') AS [Pet(s)]
From @YourTable A
OwnerID Pet(s)
1 X, Y, and Z
2 Apples
-- DDL and sample data population, start
DECLARE @tbl TABLE (OwnerID int, pn VARCHAR(50));
INSERT INTO @tbl (OwnerID, pn) VALUES
(1,'X'),
(1,'Y'),
(1,'Z'),
(2,'Apples');
-- DDL and sample data population, end
SELECT p.OwnerID
, (SELECT *
FROM @tbl AS c
WHERE c.OwnerID = p.OwnerID
FOR XML PATH('r'), TYPE, ROOT('root')
).query('
for $x in /root/r/pn/text()
return if ($x is (/root/r[last()]/pn/text())[1]) then
if (count(/root/r) gt 1) then concat("and ", $x) else string($x)
else concat($x, ",")
').value('.', 'VARCHAR(MAX)') AS Result
FROM @tbl AS p
GROUP BY p.OwnerID;
+---------+----------------+
| OwnerID | Result |
+---------+----------------+
| 1 | X, Y, and Z |
| 2 | Apples |
+---------+----------------+