我正在做一个视图,在一列中,我会把一些名字串联在一起。
理想情况下,我希望此结果看起来像以下内容:
ResultA, ResultB, ResultC and ResultD
ResultB, ResultC and ResultD
ResultA and ResultD
所以我希望它在结果之间保持逗号,直到到达最后一个在其前面放置AND而不是逗号的最后结果。
我可以执行查询以获取我需要的列,但是不知道如何执行以上操作...
select
isnull(replace(isnull(givenname, '') + ' ' +
(isnull(middlename, '') + ' ' + (isnull(lastname, ''), ' ', ' '), '') +
isnull(companyname, '') as Name
from
table1 with (nolock)
left outer join
table2 on t1key = t2key
left outer join
table3 ON t1key = t3key
我在其他地方找到了此查询,它将为我所有内容加上逗号,但是在最后一个结果之前,我仍然需要'and'。
SELECT
ID, Name,
STUFF((SELECT ',' + CAST(T2.SomeColumn AS VARCHAR(MAX))
FROM @T T2
WHERE T1.id = T2.id AND T1.name = T2.name
FOR XML PATH('')), 1, 1, '') SOMECOLUMN
FROM
@T T1
GROUP BY
id, Name
答案 0 :(得分:0)
您可以使用row_number()
窗口函数来枚举行。当数字等于1
时,将其作为最后一行并加上' and '
,否则加上', '
-为此使用CASE ... END
。
但是请确保您也按与OVER
的{{1}}子句中使用的表达式相同的顺序对整个结果进行排序,但方向相反(row_number()
而非ASC
反之亦然)。否则,您将DESC
放在第一个值之前,而不是最后一个值。
由于前置字符串不再具有统一的长度(' and '
与', '
),因此通常的' and '
将不容易工作。解决该问题的一种方法是将行号与表的行数进行比较-我们可以在子查询中获得该行号。如果它们相等,则跳过前置。再次可以使用stuff()
,另一个嵌套在其中。
由于我不清楚您的架构,因此我举一个不相关的示例:
CASE ... END