根据客户编号连接单列中的值

问题描述 投票:0回答:1

目前我正在努力加入送货频率,而不重复物品,因为某些客户有两种不同的送货频率。图片下方的代码是我正在尝试解决的问题,但它需要每个客户的“频率”列的每个条目并将它们组合起来。

SELECT  DISTINCT CUSNO,ITEM,Description,InvoiceDate,QShp,LAST_NAME,ItemType,RouteFreq,
STUFF((SELECT ', ' + CAST(FREQ AS VARCHAR(MAX))
 FROM Secondary AS S1 WHERE (FREQ = S1.FREQ)FOR XML PATH(''),TYPE 
).value('.','VARCHAR(MAX)'),1,2,'') AS FREQ
FROM Secondary
GROUP BY CUSNO,ITEM,Description,InvoiceDate,QShp,LAST_NAME,ItemType,RouteFreq,FREQ

我想要制作的是一列,仅将每个客户号码的两种不同频率显示为一行。

sql-server reporting-services sql-server-2019
1个回答
0
投票

您的代码使用不同的列,所以我可能会忽略一些东西。

数据

if(OBJECT_ID('tempdb..#tmp_Secondary') is not null)
    drop table #tmp_Secondary

CREATE TABLE #tmp_Secondary(customer int, item nvarchar(50), date datetime, Qty int, [Type] nvarchar(50), Frequency nvarchar(50))
INSERT INTO #tmp_Secondary
VALUES 
    (100100, 'item 1', '2023-12-15', 102, 'HardGood', 'W4'),
    (100100, 'item 1', '2023-12-15', 102, 'HardGood', 'Y1'),
    (100100, 'Rental item 1', '2023-12-15', 0, 'Rental', 'W4'),
    (100100, 'Rental item 1', '2023-12-15', 0, 'Rental', 'Y1')

Stuff 这只需要链接到客户和商品的外部查询。之后它就按预期工作了。

SELECT customer,item,date,Qty,type,
    STUFF(
        (SELECT 
            ', ' + CAST(Frequency AS VARCHAR(MAX))
         FROM #tmp_Secondary AS S1 
         WHERE (ts.customer = S1.customer AND ts.item = s1.item)
         FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)'),1,2,''
    ) AS FREQ
FROM #tmp_Secondary ts
GROUP BY customer,item,date,Qty,type

STRING_AGG 因为查询是按客户、商品、日期、数量分组的,所以键入频率将聚合到同一列。您不需要添加WITHIN GROUP,但它允许您根据需要添加排序。

SELECT customer, item, date, Qty, type,
    STRING_AGG(Frequency, ',') WITHIN GROUP ( ORDER BY Frequency ASC) AS Combined
FROM #tmp_Secondary
group by customer, item, date, Qty, type

结果

客户 项目 日期 数量 类型 合并
100100 第 1 项 2023-12-15 00:00:00.000 102 硬好 W4,Y1
100100 租赁物品1 2023-12-15 00:00:00.000 0 出租 W4,Y1
© www.soinside.com 2019 - 2024. All rights reserved.