Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在逗号分隔的列表末尾添加“and”_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 在逗号分隔的列表末尾添加“and”

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

目前,我正在使用stuff函数为每行创建一个逗号分隔的列表

x、 y,z

我想为列表中的n-1项添加逗号,最后一项前面加上“and”

x、 y和z

出于这些目的,仅仅检查行号是行不通的,因为这个列表是根据唯一Id生成的,因此我不能只迭代到表的末尾。代码如下:

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         |
+---------+----------------+