通过仅打印最后一个值的自定义订单

时间:2019-10-22 13:14:35

标签: sql sql-server sql-server-2012

我有下面的脚本。它只会打印出一个值,而不能全部打印出来。

 Pot

 ABC
 MPOT
 NVPN
 PLGG   

但是,当我删除按个案排序的部分时,它将打印所有值。这是为什么?在这里不可能使用自定义订单吗?

declare @pot nvarchar(max) = ''

select @pot = @pot + QUOTENAME(pot) + ',' 
from myTbl
group by pot
order by case when pot = 'MPot' then '1'
else pot end

print(@pot)

3 个答案:

答案 0 :(得分:5)

如果您要创建带分隔符的列表,则有“更好”的方法。如果您使用的是2017年以上的版本,则可以使用STRING_AGG

CREATE TABLE dbo.myTbl (Pot varchar(4));

INSERT INTO dbo.myTbl (Pot)
VALUES('ABC'),
      ('MPOT'),
      ('NVPN'),
      ('PLGG');
GO
DECLARE @Pot nvarchar(MAX)

SET @Pot = (SELECT STRING_AGG(QUOTENAME(Pot), ',') WITHIN GROUP (ORDER BY CASE WHEN Pot = 'MPot' THEN '1' ELSE Pot END) FROM dbo.myTbl);

PRINT @Pot;

如果您使用的是2016-,则可以使用FOR XML PATH

DECLARE @Pot nvarchar(MAX);

SET @Pot = STUFF((SELECT ',' + QUOTENAME(Pot)
                  FROM dbo.myTbl
                  ORDER BY CASE WHEN Pot = 'MPot' THEN '1' ELSE Pot END
                  FOR XML PATH(N''), TYPE).value('.', 'nvarchar(MAX)'),1,1,'');

答案 1 :(得分:1)

我只能想象您正在尝试按确定的顺序连接这些值。我建议:

declare @pot nvarchar(max) = '';

select @pot = string_agg( pot, ',') within group (order by case when pot = 'MPot' then '1' else pot end) 
from (select distinct pot from myTbl) t;

print @pot;

答案 2 :(得分:0)

这是我的解决方法

declare @mytbl as table(pot nvarchar(max),n int)
insert into @mytbl values('',0),('ABC',0),('MPOT',-1),('NVPN',0),('PLGG',0)



declare @pot nvarchar(max) = ''

select @pot = @pot + QUOTENAME(pot) + ',' 
from @mytbl
group by pot,n
order by n--case when pot = 'MPot' then '1'else pot end
print(@pot)