首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >连接多个列,但如果一个单元格在sql server中为空或空,则避免使用两个单元格。

连接多个列,但如果一个单元格在sql server中为空或空,则避免使用两个单元格。
EN

Stack Overflow用户
提问于 2020-04-07 13:47:14
回答 3查看 37关注 0票数 0

我从这样的一张桌子上取了唱片:

代码语言:javascript
复制
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 

我想将以下的值连接起来:

代码语言:javascript
复制
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

有谁能帮我解决这个问题吗,谢谢你提前。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-04-07 14:22:15

您可以如下所示使用MSSQL来实现所需的输出-

这里的演示

代码语言:javascript
复制
    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

我已经考虑过“”你的空白栏如下-

代码语言:javascript
复制
AND NOT (AttVal = '' AND attuom = '')

但如果你有空,就用-

代码语言:javascript
复制
AND NOT (AttVal IS NULL AND attuom IS NULL)
票数 1
EN

Stack Overflow用户

发布于 2020-04-07 14:23:01

我将您的一些数据放入了一个表变量中(我没有将其全部放入表中,只是在拥有足够的数据以显示此功能和保持理智之间的细微之处):

代码语言:javascript
复制
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; 

然后,我编写了这个查询,以满足您的要求:

代码语言:javascript
复制
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;

结果是(记住我没有把所有的数据都放进去):

代码语言:javascript
复制
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把它变成一个逗号分隔的列表。
票数 1
EN

Stack Overflow用户

发布于 2020-04-07 14:33:42

使用STRING_AGG()

代码语言:javascript
复制
select itemnum, nounmod,
       concat(NounMod, string_agg(concat(att, (':' + AttVal)), ' '))
from t
group by itemnum, nounmod;

注意,CONCAT()忽略NULL值,而+将返回NULL

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61081516

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档