【问题标题】:Need distinct comma delimited product values order by date需要不同的逗号分隔的产品值按日期排序
【发布时间】:2020-05-17 07:11:47
【问题描述】:

我有下面的表结构

create TABLE PRODUCTDeatils 
(
    Product varchar(50),
    Date Datetime
)

我想要一个输出,其中我得到具有不同值但按日期排序的逗号分隔列表。

我首先通过以下查询拆分值

SELECT DISTINCT
    LTRIM(RTRIM(value)) AS Product, date
INTO #tmp3
FROM PRODUCTDeatils
CROSS APPLY STRING_SPLIT(LTRIM(RTRIM(Product)), ',')    

SELECT * 
FROM #tmp3 
ORDER BY date

然后我使用以下两个查询来实现它但没有成功。

查询 #1:

DECLARE @cols AS NVARCHAR(MAX);

SELECT @COLS =  substring(list, 1, LEN(list) - 1)
FROM   
    (SELECT 
         list = (SELECT DISTINCT Product + ';'
                 FROM #tmp3
                 ORDER BY Product + ';'
                 FOR XML PATH(''), TYPE).value('.', 'nvarchar(MAX)')) AS T

SELECT @COLS

查询 #2:

 SELECT  
     STUFF((SELECT '; ' + Product
            FROM 
                (SELECT DISTINCT TOP 100
                     Product,date
                 FROM #tmp3) x  
            ORDER BY date
            FOR XML PATH('')), 1, 2, '') Text

我想要上面的输出,但 bat 应该只出现一次。

【问题讨论】:

标签: sql sql-server csv sql-order-by distinct


【解决方案1】:

在较新版本的 SQL Server 中,您应该只使用string_agg()

SELECT STRING_AGG(Product, ',') WITHIN GROUP (ORDER BY date)
FROM (SELECT LTRIM(RTRIM(s.value)) AS Product, MIN(date) as date
      FROM ProductDetails pd CROSS APPLY
           STRING_SPLIT(LTRIM(RTRIM(pd.Product)), ',') s 
      GROUP BY LTRIM(RTRIM(s.value))
     ) p

Here 是一个 dbfiddle。

【讨论】:

    【解决方案2】:

    您可以添加row_number 并为每个产品选择一个值。

    SELECT DISTINCT
        LTRIM(RTRIM(value)) AS Product, date, ROW_NUMBER() over (partition by trim(Value) order by date) rn
    INTO #tmp3
    FROM PRODUCTDeatils
    CROSS APPLY STRING_SPLIT(LTRIM(RTRIM(Product)), ',')    
    
    SELECT  
         STUFF((SELECT '; ' + Product
                FROM 
                    (SELECT DISTINCT TOP 100
                         Product,date
                     FROM #tmp3 where rn = 1) x  
                ORDER BY date
                FOR XML PATH('')), 1, 2, '') Text
    

    请找到 dbfiddle here

    【讨论】:

      猜你喜欢
      • 2017-06-22
      • 1970-01-01
      • 1970-01-01
      • 2012-08-31
      • 2014-02-19
      • 1970-01-01
      • 2015-12-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多