Sql 需要按日期排序的以逗号分隔的不同产品值

Sql 需要按日期排序的以逗号分隔的不同产品值,sql,sql-server,csv,sql-order-by,distinct,Sql,Sql Server,Csv,Sql Order By,Distinct,我有下面的表格结构 create TABLE PRODUCTDeatils ( Product varchar(50), Date Datetime ) 我想要一个输出,其中我得到逗号分隔的列表,具有不同的值,但按日期排序 我首先通过下面的查询拆分这些值 SELECT DISTINCT LTRIM(RTRIM(value)) AS Product, date INTO #tmp3 FROM PRODUCTDeatils CROSS APPLY STRING_SPLI

我有下面的表格结构

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:

问题2:


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

您可以添加
行号
,并且每个产品只选择一个值

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

请在较新版本的SQL Server中找到dbfiddle

,您只需使用
string\u agg()


是一个dbfiddle。

而不是单独切换到聚合:
LTRIM(RTRIM(value))作为产品,MIN(date)
在查询中#2.规范化架构。阅读。请显示您想要的结果。
 SELECT  
     STUFF((SELECT '; ' + Product
            FROM 
                (SELECT DISTINCT TOP 100
                     Product,date
                 FROM #tmp3) x  
            ORDER BY date
            FOR XML PATH('')), 1, 2, '') Text
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
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