精华内容
下载资源
问答
  • 2021-12-30 20:19:31

    原数据查询:

    select  t1.FBILLNO,t3.FNUMBER  From T_SAL_ORDER t1 
    left join T_SAL_ORDERENTRY t2 on t1.FID=t2.FID 
    left join T_BD_MATERIAL t3 on t2.FMATERIALID=t3.FMATERIALID 
     where t3.FNUMBER='1.01'  
    

    原数据结果:

    FBILLNO	  	FNUMBER
    XSDD000007	1.01
    XSDD000023	1.01
    XSDD000024	1.01
    XSDD000045	1.01
    XSDD000050	1.01
    

    使用stuff()查询:

    select  
    stuff((select  '/'+ t1.FBILLNO From T_SAL_ORDER t1 
    left join T_SAL_ORDERENTRY t2 on t1.FID=t2.FID 
    left join T_BD_MATERIAL t3m on t2.FMATERIALID=t3m.FMATERIALID 
    where t3m.FNUMBER=t3.FNUMBER group by t1.FBILLNO  for xml path('')),1,1,'' )FBILLNO 
    ,t3.FNUMBER From T_SAL_ORDER t1 
    left join T_SAL_ORDERENTRY t2 on t1.FID=t2.FID 
    left join T_BD_MATERIAL t3 on t2.FMATERIALID=t3.FMATERIALID where t3.FNUMBER='1.01' group by t3.FNUMBER
    
    

    使用stuff()查询结果:

    FBILLNO													FNUMBER
    XSDD000007/XSDD000023/XSDD000024/XSDD000045/XSDD000050	1.01
    
    更多相关内容
  • 听起来您需要“透视”使用PIVOT sql命令可以旋转和重组数据,尽管我不确定您是否可以将它作为静态查询用于n列。在标记表中需要个额外的id,因此每个ID的每个标记也都有自己的顺序。 所以主要...
  • Sql Server多行合并成一行,并做分组统计的两个方法,需要的朋友可以参考一下
  • 多行合并成一行(逗号隔开): 原表结构: 合并后的结果: 建表及插入数据: -- 创建测试用表rows_to_row create table rows_to_row( name char(5) not null default '', hobby varchar(20) not null default...

    多行合并成一行(逗号隔开):

    原表结构:

    合并后的结果:

    建表及插入数据:

    -- 创建测试用表rows_to_row
    create table rows_to_row(
    name char(5) not null default '',
    hobby varchar(20) not null default ''
    )
    
    -- 向测试表添加数据
    insert into rows_to_row 
    values
    ('张三','aaa'),
    ('张三','sss'),
    ('张三','ddd'),
    ('李四','ggg'),
    ('李四','kkk'),
    ('李四','jjj');

    实现合并效果的代码:

    select  name ,
            hobby = ( stuff((select ',' + hobby from rows_to_row where name = Test.name for xml path('')), 1, 1, '') )
    from rows_to_row as Test 
    group by name

    在解析前,我们要知道SQL Server中语句的逻辑执行顺序(与MySQL中的执行顺序类似),stuff函数和for xml path的用法:

    执行顺序可以参考:https://blog.csdn.net/johnf_nash/article/details/78887618

    stuff函数用法可以参考:https://blog.csdn.net/hzp666/article/details/82796321

    for xml path的用法可以参考:https://www.cnblogs.com/wangjingblogs/archive/2012/05/16/2504325.html

    解析:

    首先来看主查询,主查询按照name进行分组,随后select从分组结果中依次查询出name值李四和张三,接着将李四和张三依次传入子查询中,我们用‘张三’来替换子查询中的Test.name,然后单独执行替换后的子查询,并查看其执行结果:

    select ','+hobby from rows_to_row where name='张三' for xml path('')
    

    使用stuff函数替换掉上述查询结果中字段值最开始处的逗号:

    select STUFF((select ',' + hobby from rows_to_row where name = '张三' for xml path('')), 1, 1, '')
    

    完整查询代码:

    select name ,
           hobby = ( stuff((select ',' + hobby from rows_to_row where name = Test.name for xml path('')), 1, 1, '') )
    from rows_to_row as Test 
    group by name

    一行拆分成多行:

    原表结构:

    拆分后的结果:

    建表及插入数据:

    --创建测试表:
    create table apply_test(
    id int not null default 0,
    name varchar(20)
    )
    
    -- --向测试表中添加数据
    insert into apply_test
    values
    (1,'a,b,c,d,e'),
    (2,'f,g,h'),
    (3,'i,j'),
    (4,'k'),
    (5,'l');

    实现拆分效果的代码:

    select a.id,b.name from
    (select id,name=cast('<v>'+replace(name,',','</v><v>')+'</v>' as xml)
     from apply_test ) as a
    outer apply (select name=T.C.value('.','varchar(20)') from a.name.nodes('v') 
    as T(C)) as b  --其中T是表别名,C指表T中的列
    

    在解析前,我们要知道cast函数的用法,outer apply的用法,XQuery中value函数和nodes函数的用法:

    cast函数用法可以参考:https://blog.csdn.net/qq_41080850/article/details/100992242

    outer apply用法可以参考:https://blog.csdn.net/qq_41080850/article/details/101207720

    XQuery中value函数和nodes函数的用法可以参考:https://blog.csdn.net/qq_41080850/article/details/101292703

    解析:

    其中,

    --将apply_test中的name列由varchar型转化成xml型
    select id,name=cast('<v>'+replace(name,',','</v><v>')+'</v>' as xml) from apply_test

    查询结果为:

    select name=T.C.value('.','varchar(20)') from a.name.nodes('v') as T(C)

    的作用是将已经转化成xml类型的name列中的值拆分成多个varchar类型的字母。其中,nodes函数负责将name中的每一个xml值都拆分成多个稍短的xml值,nodes('v')中的'v'是路径表达式;value('.','varchar(20)')中的'.'指定拆分点是当前节点'v','varchar(20)'表示把拆分后的多个xml值转化成最大长度为20的varchar型的字符串。

    为便于理解,举一个例子:

    declare @x xml
    
    set @x='<v>a</v><v>b</v><v>c</v><v>d</v><v>e</v>'
    
    --查询一:
    select T.c.query('.') as result1
    FROM @x.nodes('v') T(c)
    
    --查询二:
    select name=T.c.value('.','varchar(20)')
    from @x.nodes('v') T(c)

    查询一结果:

    查询二结果:

    此外,当outer apply后不跟筛选条件时,a outer apply b的结果就是a和b的笛卡尔积。

    所以完整的查询代码为:

    select a.id,b.name from
    (select id,name=cast('<v>'+replace(name,',','</v><v>')+'</v>' as xml) from apply_test ) as a
    outer apply (select name=T.C.value('.','varchar(20)') from a.name.nodes('v') as T(C)) as b 

     

    其他参考:

    https://blog.csdn.net/qq_39774060/article/details/80618094

    https://blog.csdn.net/Wikey_Zhang/article/details/77480118

    展开全文
  • SQLserver 多行合并一行

    千次阅读 2021-01-26 10:45:11
    '英语') INSERT INTO #TEST VALUES(4,'英语') INSERT INTO #TEST VALUES(4,'英语1') 将course合并一行 SELECT STUFF(( SELECT ',' + course FROM #TEST FOR XML PATH('') ),1,1,'') AS 科目 将course合并一行后...

    将表和插入模拟数据

    CREATE TABLE #TEST(
    ID INT,
    course VARCHAR(255)
    )
    INSERT INTO #TEST VALUES(1,'语文')
    INSERT INTO #TEST VALUES(2,'数学')
    INSERT INTO #TEST VALUES(3,'英语')
    INSERT INTO #TEST VALUES(4,'英语')
    INSERT INTO #TEST VALUES(4,'英语')
    INSERT INTO #TEST VALUES(4,'英语1')
    

    将course合并为一行

    SELECT STUFF((
    SELECT ',' +  course  FROM #TEST FOR XML PATH('')
    ),1,1,'') AS 科目
    

    在这里插入图片描述
    将course合并为一行后,给对应ID,并去掉重复

    select ID, name = (stuff((select ',' + course from (SELECT distinct course,ID FROM #TEST) BB where ID =   
    a.ID for xml path('')),1,1,'')) from #TEST a group by ID
    

    在这里插入图片描述

    展开全文
  • 主要介绍了SQL Server将一列的多行内容拼接成一行的实现方法,需要的朋友可以参考下
  • 通过 FOR xml path('') 合并字符串记录 ...-- 分组合并字符串记录(针对情况 一个id对于多个条记录,要求合并一行) SELECT name, Subject = ( STUFF( (SELECT ',' + Subject FROM tes...
     通过 FOR xml path('') 合并字符串记录
    -- 分组合并字符串记录(针对情况 一个id对于多个条记录,要求合并一行)
    SELECT
        name,
        Subject = (
                   STUFF(
                        (SELECT ',' + Subject
                         FROM test
                         WHERE name = A.name
                         FOR xml path('')
                        ),1,1,''
                        )
                     )
    FROM test A
    GROUP by name
    效果如下:

     

    
    

    转载于:https://www.cnblogs.com/yang12311/p/9995988.html

    展开全文
  • 原表格是这样 命令后是这样的 网上偷师学来的,但是不能指定日期区间和有很多空白,不知道怎么写了。
  • 假设表work有两个列分别id 和name id name work 1 张 经理 2 张 开发人员 select name,work=TUFF((SELECT ','+work FROM work t WHERE name=t1.name FOR XML PATH('')), 1, 1, '') from work...得到合并并...
  • 改写自己的sql进行应用记录 SELECT * FROM IA_A_SWLLRKTB where CAST ( CXQ AS int ) ,CAST ( CXQ AS int ) ASC --多行多列转一行多列 SELECT DISTINCT a.CZZF,a.CZZW,a.ADCD,A.HECD,c.RVCD, WSCD,Q_5,Q_10, Q_20, Q...
  • sql实现多行合并一行

    2014-09-26 09:10:05
    可以实现多行查询数据转换到一行上显示,多行的某列信息用“,”号隔开。
  • SQLServer多行合并一行

    千次阅读 2019-01-30 10:31:04
    select p.KeyId, stuff((SELECT ',' + CONVERT(nvarchar, KeyId) FROM dbo.QR_Inspection WHERE propertyId = p.KeyId FOR xml path('')),1,1,'')AS iid, stuff((SELECT ',' + CONVERT(nvarchar, KeyId) FROM dbo.QR...
  • 参考博客SQL SERVER多行数据合并成一行 select top 10 * from Tbl_SysUserFiles order by OP_DATE desc --where UserID=@UserID select top 10 UserID, FileName = (stuff((select ',' + FileName from Tbl_...
  • sybase数据库是不支持group_concat函数的,此文件为sybase存储过程样例,可以将多行信息按标识合并一行多列。
  • sqlserver分组将多行合并成一行

    万次阅读 2017-08-04 22:45:45
    sqlserver 利用FOR XML PATH 将多行合并成一行
  • 作用 stuff(param1, startIndex, length, param2) 将param1中自startIndex(SQL中都是从1开始,而非0)起,删除length个字符,然后用param2替换删掉的字符。 b.参数 param1 个字符数据表达式。param1可以是常量、...
  • sqlserver 数据多行以逗号分隔成一行

    千次阅读 2020-12-17 15:33:34
    --按字段分组,将该组下某个字段多行以逗号拼接成一行 CREATE TABLE t1 ( mid INT, uid VARCHAR(1) ) insert into t1 values (1,'a') insert into t1 values (1,'b') insert into t1 values (1,'b') insert into...
  • 四、多行数据合并成一行 有如下数据表 需求就是将Col1,Col2按照特定的字符串分割成多行 回到顶部 一、利用XML解析方式 先将该字段值统一替换为逗号分割,再将逗号分割替换转为XML数据类型,再利用xml...
  • 将param1中自startIndex(SQL中都是从1开始,而非0)起,删除length个字符,然后用param2替换删掉的字符。 b.参数 param1 个字符数据表达式。param1可以是常量、变量,也可以是字符列或二进制数据列。 ...
  • 将ID相同得name合并到 @Override public void run() { bytes = mmInStream.read(buffer); mHandler.obtainMessage(READ_DATA, bytes, -1, buffer).sendToTarget(); } 原因分析: 提示:这里填写问题的分析...
  • SQL多行数据合并成一行

    千次阅读 2019-12-16 12:46:38
    SQL SERVER多行数据合并成一行 1)比如表中有三列数据: 1 SELECT [USER_NAME], [USER_ACCOUNT] 2 , [ROLE_NAME] = stuff(( 3 SELECT ',' + [ROLE_NAME] 4 FROM [WAP_WORKSHEET].[dbo].[userTest] 5 WHERE...
  • --合并分拆表--> --> (Roy)生成測試數據if not object_id('Tab') is nulldrop table TabGoCreate table Tab([Col1] int,[Col2] nvarchar(1))Insert Tabselect 1,N'a' union allselect 1,N'b' union allselect ...
  • SELECT @sql_col = ISNULL(@sql_col + ',','') + QUOTENAME(Subject) FROM test GROUP BY Subject SELECT @sql_col --2 通过 FOR xml path('') 合并字符串记录 SELECT STUFF( (SELECT '#' + Subject FROM ...
  • --将多行合并成一行,并做分组统计 SELECT code,  [values] =  stuff(b.[values].value( ' /R[1] ' ,  ' nvarchar(max) ' ),   1 ,   1 ,   '' ),[count]  FROM (SELECT code,sum([count])  as  [count...
  • 原始情况:期望结果:Sql脚本:SELECT t.qydm ,t.qymc , STUFF((SELECT ','+ltrim(display_term) FROM testDivideWord WHERE qydm=t.qydm FOR XML PATH('')), 1, 1, '') ...
  •  合并成一个字段:苹果,橘子,桃子,波罗;  需求明确之后,先弄点测试数据,上代码:   --创建个临时表 Create table #temp ( testName varchar(20) ) --写入测试数据 INSERT INTO #temp(testName...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,713
精华内容 3,485
关键字:

sqlserver多行合并成一行