我从这样的一张桌子上取了唱片:
ITEMNum NounMod Att AttVal attuom
13009029 ABRASIVE,OILSTONE LENGTH 150 MM
13009029 ABRASIVE,OILSTONE WIDTH 25 MM
13009029 ABRASIVE,OILSTONE HEIGHT 50 MM
13009029 ABRASIVE,OILSTONE GRIT
13009029 ABRASIVE,OILSTONE MAKE UNION ABRASIVES
13009029 ABRASIVE,OILSTONE ADDITIONAL INFORMATION SILICON CARBIDE
13009029 ABRASIVE,OILSTONE TYPE
13009029 ABRASIVE,OILSTONE APPLICATION
13009029 ABRASIVE,OILSTONE SHAPE
13009029 ABRASIVE,OILSTONE STANDARD
13009029 ABRASIVE,OILSTONE SPECIAL FEATURES
13012840 ADAPTER,COMMUNICATION TYPE CURRENT LOOP
13012840 ADAPTER,COMMUNICATION CONDUCTOR
13012840 ADAPTER,COMMUNICATION ELECTRICAL RATING 24 VDC
13012840 ADAPTER,COMMUNICATION NUMBER OF PINS
13012840 ADAPTER,COMMUNICATION SPECIAL FEATURES
13012840 ADAPTER,COMMUNICATION MAKE
13012840 ADAPTER,COMMUNICATION MODEL ST5011
13012840 ADAPTER,COMMUNICATION ADDITIONAL INFORMATION 20MA,1X 我想将以下的值连接起来:
ItemNum LongDes
13009029 ABRASIVE,OILSTONE,LENGTH:150 MM;WIDTH:25 MM;HEIGHT:50 MM;MAKE:UNION ABRASIVES;ADDITIONAL
INFORMATION:SILICON CARBIDE STONE
13012840 ADAPTER,COMMUNICATION,TYPE:CURRENT LOOP INTERFACE;ELECTRICAL RATING:24
VDC;MODEL:ST5011;ADDITIONAL INFORMATION:20MA,1X有谁能帮我解决这个问题吗,谢谢你提前。
发布于 2020-04-07 14:22:15
您可以如下所示使用MSSQL来实现所需的输出-
A.ITEMNum,
abc =
A.NounMod +','+
STUFF((
SELECT ';' + Att+','+AttVal+','+attuom
FROM your_table
WHERE ITEMNum = A.ITEMNum AND NounMod = A.NounMod
AND NOT (AttVal = '' AND attuom = '')
FOR XML PATH('')
), 1, 1, '')
FROM your_table A
GROUP BY A.ITEMNum,A.NounMod我已经考虑过“”你的空白栏如下-
AND NOT (AttVal = '' AND attuom = '')但如果你有空,就用-
AND NOT (AttVal IS NULL AND attuom IS NULL)发布于 2020-04-07 14:23:01
我将您的一些数据放入了一个表变量中(我没有将其全部放入表中,只是在拥有足够的数据以显示此功能和保持理智之间的细微之处):
DECLARE @table TABLE (ITEMNum INT, NounMod VARCHAR(50), Att VARCHAR(50), AttVal VARCHAR(50), attuom VARCHAR(50));
INSERT INTO @table SELECT 13009029, 'ABRASIVE,OILSTONE', 'LENGTH', '150', 'MM';
INSERT INTO @table SELECT 13009029, 'ABRASIVE,OILSTONE', 'WIDTH', '25', 'MM';
INSERT INTO @table SELECT 13009029, 'ABRASIVE,OILSTONE', 'HEIGHT', '50', 'MM';
INSERT INTO @table SELECT 13009029, 'ABRASIVE,OILSTONE', 'GRIT', NULL, NULL;
INSERT INTO @table SELECT 13012840, 'ADAPTER,COMMUNICATION', 'TYPE', 'CURRENT LOOP', NULL; 然后,我编写了这个查询,以满足您的要求:
WITH cte AS (
SELECT DISTINCT ITEMNum, NounMod, NounMod AS LongDes FROM @table
UNION ALL
SELECT ITEMNum, NounMod, CONCAT(Att, ';', AttVal, ' ', ISNULL(attuom, '')) AS LongDes FROM @table WHERE AttVal IS NOT NULL)
SELECT ITEMNum, LongDes = STUFF(
(SELECT ',' + LongDes FROM cte c1 WHERE c1.ITEMNum = c2.ITEMNum
FOR XML PATH ('')), 1, 1, '') FROM cte c2 GROUP BY ITEMNum;结果是(记住我没有把所有的数据都放进去):
ITEMNum LongDes
13009029 ABRASIVE,OILSTONE,LENGTH;150 MM,WIDTH;25 MM,HEIGHT;50 MM
13012840 ADAPTER,COMMUNICATION,TYPE;CURRENT LOOP 这里有一些事情要做,下面是一些建议:
NounMod作为描述的一部分,因此我使用UNION将此描述和其他描述输入到列表中,在列表中忽略AttVal列中的空值;FOR XML PATH把它变成一个逗号分隔的列表。发布于 2020-04-07 14:33:42
使用STRING_AGG()
select itemnum, nounmod,
concat(NounMod, string_agg(concat(att, (':' + AttVal)), ' '))
from t
group by itemnum, nounmod;注意,CONCAT()忽略NULL值,而+将返回NULL。
https://stackoverflow.com/questions/61081516
复制相似问题