使用SQL将多行转换为CSV时删除重复项

时间:2018-07-05 17:41:56

标签: sql sql-server csv rows

我正在创建一个视图,在其中需要拉出一列的所有行并将其转换为CSV格式。

SELECT 
    SUBSTRING((SELECT ',' + CAST(s.marketConfigId AS varchar(MAX)) 
               FROM [Metric].[MetricGoalDefMarket] s 
               WHERE [metricGoalDefId]=21 
               ORDER BY s.marketConfigId 
               FOR XML PATH('')),2,200000) AS marketConfigID 

使用上面的查询可以创建CSV格式,但它还会显示重复项。当您运行上面的查询时,它将输出显示为

**marketConfigID**
751,751,742,751,751,784,1850,737

如何删除重复项?

PS:在创建视图时,我不想使用here中的dbo.DistinctList可以删除重复项的函数

2 个答案:

答案 0 :(得分:2)

似乎distinct可以工作:

SELECT SUBSTRING((SELECT DISTINCT ',' + CAST(s.marketConfigId AS varchar(MAX)) 
                  FROM [Metric].[MetricGoalDefMarket] s 
                  WHERE [metricGoalDefId]=21 
                  ORDER BY s.marketConfigId 
                  FOR XML PATH('')
                  ), 2,200000) AS marketConfigID

您无需使用substring(),而可以使用stuff()

SELECT STUFF ( (SELECT DISTINCT ',' + CAST(s.marketConfigId AS varchar(MAX)) 
                FROM [Metric].[MetricGoalDefMarket] s 
                WHERE [metricGoalDefId]=21 
                FOR XML PATH('')
                ), 1, 1, ''
             ) AS marketConfigID 

答案 1 :(得分:1)

您尝试过DISTINCT吗?

编辑:抱歉,我误读了您的查询。我认为您想使用子选择查询(应用DISTINCT)来获取marketConfigIds,而不是像我在下面这样在外部级别获取

SELECT DISTINCT
    SUBSTRING((SELECT ',' + CAST(s.marketConfigId AS varchar(MAX)) 
               FROM [Metric].[MetricGoalDefMarket] s 
               WHERE [metricGoalDefId]=21 
               ORDER BY s.marketConfigId 
               FOR XML PATH('')),2,200000) AS marketConfigID