目前我正在努力加入送货频率,而不重复物品,因为某些客户有两种不同的送货频率。图片下方的代码是我正在尝试解决的问题,但它需要每个客户的“频率”列的每个条目并将它们组合起来。
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
我想要制作的是一列,仅将每个客户号码的两种不同频率显示为一行。
您的代码使用不同的列,所以我可能会忽略一些东西。
数据
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 |