GVKun编程网logo

SQL Server:将几行数据合并为一行(sql server 多行数据合并一行)

2

对于SQLServer:将几行数据合并为一行感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍sqlserver多行数据合并一行,并为您提供关于linux中将指定行数据合并为一行数据、mysql中

对于SQL Server:将几行数据合并为一行感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍sql server 多行数据合并一行,并为您提供关于linux中将指定行数据合并为一行数据、mysql中将多行数据合并成一行数据、SQL 2008将具有相同ID的多行数据合并为一行、SQL Server Sql function 多行中的列合并为一行一列的方法的有用信息。

本文目录一览:

SQL Server:将几行数据合并为一行(sql server 多行数据合并一行)

SQL Server:将几行数据合并为一行(sql server 多行数据合并一行)

我想要做的是合并几行数据,以便在Transact-SQL或SSIS中将其显示为单行。因此,例如:

制作:

REF  ID   Title Surname     Forename    DOB          Add1            Postcode------------------------------------------------------------------------------------------    D    10   MR    KINGSTON    NULL        15/07/1975   3 WATER SQUARE  NULLT    10   NULL  NULL        BOB         NULL         NULL            NULLT    10   MRS   NULL        NULL        NULL         NULL            TW13 7DT

到这个:

REF  ID   Title Surname    Forename   DOB          Add1            Postcode----------------------------------------------------------------------------------    D    10   MRS   KINGSTON   BOB        15/07/1975   3 WATER SQUARE  TW13 7DT

因此,我所做的就是将值合并在一起,而忽略了null值。(D =数据; T =更新)

任何建议将是最欢迎的。

谢谢。

答案1

小编典典

这将起作用,但是由于没有标识或日期时间列-无法找到哪个更新行是较新的。因此,如果同一列上有更多更新,那么我只需按字母/数字(MIN)来选择第一个。

WITH CTE AS (    SELECT ID, REF, MIN(Title) Title, MIN(Surname) Surname, MIN(Forename) Forename, MIN(DOB) DOB, MIN(Add1) Add1, MIN(Postcode) Postcode    FROM Table1    GROUP BY id, REF)SELECT     d.REF  , d.ID  , COALESCE(T.Title, d.TItle) AS Title  , COALESCE(T.Surname, d.Surname) AS Surname  , COALESCE(T.Forename, d.Forename) AS Forename  , COALESCE(T.DOB, d.DOB) AS DOB  , COALESCE(T.Add1, d.Add1) AS Add1  , COALESCE(T.Postcode, d.Postcode) AS PostcodeFROM CTE d INNER JOIN CTE t ON d.ID = t.ID AND d.REF = ''D'' AND t.REF = ''t''

SQLFiddle演示

如果可以添加标识列,我们可以重写CTE部分以使其更准确。

编辑:

如果我们有标识列,并且将CTE重写为递归,则实际上可以删除整个查询的其他部分。

WITH CTE_RN AS (    --Assigning row_Numbers based on identity - it has to be done since identity can always have gaps which would break the recursion    SELECT *, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY IDNT DESC) RN FROM dbo.Table2),RCTE AS (    SELECT  ID ,            Title ,            Surname ,            Forename ,            DOB ,            Add1 ,            Postcode ,            RN FROM CTE_RN WHERE RN = 1 -- taking the last row for each ID    UNION ALL    SELECT r.ID,        COALESCE(r.TItle,p.TItle), --Coalesce will hold prev value if exist or use next one        COALESCE(r.Surname,p.Surname),        COALESCE(r.Forename,p.Forename),        COALESCE(r.DOB,p.DOB),        COALESCE(r.Add1,p.Add1),        COALESCE(r.Postcode,p.Postcode),        p.RN    FROM RCTE r    INNER JOIN CTE_RN p ON r.ID = p.ID AND r.RN + 1 = p.RN --joining the previous row for each id),CTE_Group AS (    --rcte now holds both merged and unmerged rows, merged is max(rn)    SELECT ID, MAX(RN) RN FROM RCTE    GROUP BY ID  )SELECT r.* FROM RCTE rINNER JOIN CTE_Group g ON r.ID = g.ID AND r.RN = g.RN

SQLFiddle演示

linux中将指定行数据合并为一行数据

linux中将指定行数据合并为一行数据

1、测试数据

root@DESKTOP-1N42TVH:/home/test# ls
a.txt
root@DESKTOP-1N42TVH:/home/test# cat a.txt
01 11
02 12
03 13
04 14
05 15
06 16
07 17
08 18
09 19
10 20

 

2、将每两行数据合并为一行数据

a、sed实现

root@DESKTOP-1N42TVH:/home/test# ls
a.txt
root@DESKTOP-1N42TVH:/home/test# cat a.txt
01 11
02 12
03 13
04 14
05 15
06 16
07 17
08 18
09 19
10 20
root@DESKTOP-1N42TVH:/home/test# sed 'N; s/\n/ /' a.txt   ## 将每两行中间的换行符替换为空格
01 11 02 12
03 13 04 14
05 15 06 16
07 17 08 18
09 19 10 20

 

b、awk实现

root@DESKTOP-1N42TVH:/home/test# ls
a.txt
root@DESKTOP-1N42TVH:/home/test# cat a.txt
01 11
02 12
03 13
04 14
05 15
06 16
07 17
08 18
09 19
10 20
root@DESKTOP-1N42TVH:/home/test# awk '{if(NR % 2 == 0) {print $0} else {printf("%s ", $0)}}' a.txt
01 11 02 12
03 13 04 14
05 15 06 16
07 17 08 18
09 19 10 20

 

c、paste实现

root@DESKTOP-1N42TVH:/home/test# ls
a.txt
root@DESKTOP-1N42TVH:/home/test# cat a.txt
01 02
03 04
05 06
07 08
09 10
11 12
13 14
15 16
17 18
19 20
root@DESKTOP-1N42TVH:/home/test# cat a.txt | paste - -
01 02   03 04
05 06   07 08
09 10   11 12
13 14   15 16
17 18   19 20
root@DESKTOP-1N42TVH:/home/test# cat a.txt | paste - - -d " "
01 02 03 04
05 06 07 08
09 10 11 12
13 14 15 16
17 18 19 20

 

 

3、将每三行数据合并为一行数据

a、awk实现

root@DESKTOP-1N42TVH:/home/test# ls
a.txt
root@DESKTOP-1N42TVH:/home/test# cat a.txt
01 11
02 12
03 13
04 14
05 15
06 16
07 17
08 18
09 19
10 20
root@DESKTOP-1N42TVH:/home/test# awk '{if(NR % 3 == 0) {print $0} else {printf("%s ", $0)}}' a.txt  ## 不完整行最后缺少空格
01 11 02 12 03 13
04 14 05 15 06 16
07 17 08 18 09 19
10 20 root@DESKTOP-1N42TVH:/home/test# awk '{if(NR % 3 == 0) {print $0} else {printf("%s ", $0)}}' a.txt | sed '$ s/$/\n/'  ## sed添加空格
01 11 02 12 03 13
04 14 05 15 06 16
07 17 08 18 09 19
10 20
root@DESKTOP-1N42TVH:/home/test# awk '{if(NR % 3 == 0) {print $0} else {printf("%s ", $0)}}' a.txt | sed '$ s/$/\n/'
01 11 02 12 03 13
04 14 05 15 06 16
07 17 08 18 09 19
10 20

 

b、paste实现

root@DESKTOP-1N42TVH:/home/test# ls
a.txt
root@DESKTOP-1N42TVH:/home/test# cat a.txt
01 02
03 04
05 06
07 08
09 10
11 12
13 14
15 16
17 18
19 20
root@DESKTOP-1N42TVH:/home/test# cat a.txt | paste - - -    ## 每三行合并为一行
01 02   03 04   05 06
07 08   09 10   11 12
13 14   15 16   17 18
19 20
root@DESKTOP-1N42TVH:/home/test# cat a.txt | paste - - - -d " "   ## 指定输出分割符
01 02 03 04 05 06
07 08 09 10 11 12
13 14 15 16 17 18
19 20

 

 

 

4、每四行数据合并为一行数据

a、awk实现

root@DESKTOP-1N42TVH:/home/test# ls
a.txt
root@DESKTOP-1N42TVH:/home/test# cat a.txt
01 11
02 12
03 13
04 14
05 15
06 16
07 17
08 18
09 19
10 20
root@DESKTOP-1N42TVH:/home/test# awk '{if(NR % 4 == 0) {print $0} else {printf("%s ", $0)}}' a.txt
01 11 02 12 03 13 04 14
05 15 06 16 07 17 08 18
09 19 10 20 root@DESKTOP-1N42TVH:/home/test# awk '{if(NR % 4 == 0) {print $0} else {printf("%s ", $0)}}' a.txt | sed '$ s/$/\n/'
01 11 02 12 03 13 04 14
05 15 06 16 07 17 08 18
09 19 10 20
root@DESKTOP-1N42TVH:/home/test# awk '{if(NR % 4 == 0) {print $0} else {printf("%s ", $0)}}' a.txt | sed '$ s/$/\n/' 
01 11 02 12 03 13 04 14
05 15 06 16 07 17 08 18
09 19 10 20

 

b、paste 实现

root@DESKTOP-1N42TVH:/home/test# ls
a.txt
root@DESKTOP-1N42TVH:/home/test# cat a.txt
01 02
03 04
05 06
07 08
09 10
11 12
13 14
15 16
17 18
19 20
root@DESKTOP-1N42TVH:/home/test# cat a.txt | paste - - - -
01 02   03 04   05 06   07 08
09 10   11 12   13 14   15 16
17 18   19 20
root@DESKTOP-1N42TVH:/home/test# cat a.txt | paste - - - - -d " "   ## 将四行合并为一行
01 02 03 04 05 06 07 08
09 10 11 12 13 14 15 16
17 18 19 20

 

mysql中将多行数据合并成一行数据

mysql中将多行数据合并成一行数据

地址:https://www.cnblogs.com/shoshana-kong/p/11147690.html

mysql中将多行数据合并成一行数据

一个字段可能对应多条数据,用mysql实现将多行数据合并成一行数据

例如:一个活动id(activeId)对应多个模块名(modelName),按照一般的sql语句:

1 SELECT am.activeId,m.modelName 
2 FROM activemodel am 
3 JOIN  model m 
4 ON am.modelId = m.modelId 
5 ORDER BY am.activeId

查询出的列表为图1所示:

      图1

修改过后的sql语句,查询后如图2所示:

1 SELECT am.activeId,GROUP_CONCAT(m.modelName SEPARATOR '','') modelName
2 FROM activemodel am 
3 JOIN model m 
4 ON am.modelId=m.modelId
5 WHERE m.valid=1
6 GROUP BY am.activeId

需注意:

1.GROUP_CONCAT()中的值为你要合并的数据的字段名;

 SEPARATOR 函数是用来分隔这些要合并的数据的;

 '' ''中是你要用哪个符号来分隔;

2.必须要用GROUP BY 语句来进行分组管理,不然所有的数据都会被合并成一条记录,如图3

            图2

 

                    图3

SQL 2008将具有相同ID的多行数据合并为一行

SQL 2008将具有相同ID的多行数据合并为一行

我在一个表中包含数据,该表包含同一CardNum的几行数据。我想创建一个表,其中同一CardNum的所有数据都显示在同一行上。

我的数据目前是这样的:

PartID | CardNumber | RdrGrpID | TZID0         412         31         10         412         34         10         567         38         10         567         33         50         567         71         3

这就是我想要的数据:

PartID | CardNumber | RdrGrpID_1 | TZID_1 | RdrGrpID_2 | TZID_2 | RdrGrpID_3 | TZID_30         412         31           1        34           10         567         38           1        33           5        71           3

先感谢您。

答案1

小编典典

要获得此结果,可以采用几种方式来制定查询。

如果每个partId和的值数量有限cardNumber,则可以row_number()与聚合函数/ CASE组合一起使用:

select partid, cardnumber,  max(case when rn = 1 then rdrgrpid end) rdrgrpid_1,  max(case when rn = 1 then TZID end) TZID_1,  max(case when rn = 2 then rdrgrpid end) rdrgrpid_2,  max(case when rn = 2 then TZID end) TZID_2,  max(case when rn = 3 then rdrgrpid end) rdrgrpid_3,  max(case when rn = 3 then TZID end) TZID_3from(  select partId, cardNumber, RdrGrpID, TZID      , row_number() over(partition by partiD, cardnumber                          order by rdrgrpid) rn  from yt) dgroup by partid, cardnumber;

参见带有演示的SQL Fiddle

您还可以使用PIVOT / UNPIVOT函数获取结果:

select *from(  select partid, cardnumber,     col+''_''+cast(rn as varchar(10)) col,     val  from   (    select partId, cardNumber, RdrGrpID, TZID      , row_number() over(partition by partiD, cardnumber                          order by rdrgrpid) rn    from yt  ) d  unpivot  (    val    for col in (rdrgrpid, tzid)  ) un) spivot(  max(val)  for col in (RdrGrpID_1, TZID_1, RdrGrpID_2, TZID_2,              RdrGrpID_3, TZID_3)) piv

请参阅带有演示的SQL Fiddle。

现在,如果您有未知数量的值,那么您将需要使用动态sql:

DECLARE @colsPivot AS NVARCHAR(MAX),    @query  AS NVARCHAR(MAX)select @colsPivot = STUFF((SELECT '','' + QUOTENAME(c.col + ''_''+cast(rn as varchar(10)))                     from                    (                      select row_number() over(partition by partiD, cardnumber                                                                    order by rdrgrpid) rn                      from yt                    ) t                    cross apply                    (                      select ''RdrGrpID'' col, 1 so union all                      select ''TZID'', 2                    ) c                    group by col, rn, so                    order by rn, so            FOR XML PATH(''''), TYPE            ).value(''.'', ''NVARCHAR(MAX)'')         ,1,1,'''')set @query   = ''select partid, cardnumber,  ''+@colsPivot+''       from      (        select partid, cardnumber,           col+''''_''''+cast(rn as varchar(10)) col,           val        from         (          select partId, cardNumber, RdrGrpID, TZID            , row_number() over(partition by partiD, cardnumber                                order by rdrgrpid) rn          from yt        ) d        unpivot        (          val          for col in (rdrgrpid, tzid)        ) un      ) s      pivot      (        max(val)        for col in (''+ @colspivot +'')      ) p''exec(@query);

请参阅带有演示的SQL Fiddle。所有版本均提供结果:

| PARTID | CARDNUMBER | RDRGRPID_1 | TZID_1 | RDRGRPID_2 | TZID_2 | RDRGRPID_3 | TZID_3 |-----------------------------------------------------------------------------------------|      0 |        412 |         31 |      1 |         34 |      1 |     (null) | (null) ||      0 |        567 |         33 |      5 |         38 |      1 |         71 |      3 |

SQL Server Sql function 多行中的列合并为一行一列的方法

SQL Server Sql function 多行中的列合并为一行一列的方法

感兴趣的小伙伴,下面一起跟随小编 jb51.cc的小编两巴掌来看看吧!

代码如下:

 
CREATE TABLE tb(standards varchar(50),amount varchar(50),variation varchar(50),statuss varchar(50),Reason varchar(50)) 
insert into tb values('55','279','4','物量积压','加工人员设备不足;T排制作进度较慢;') 
insert into tb values('55','部件人员不足;') 
insert into tb values('55','跨间场地积压;图纸问题较多;') 
insert into tb values('56','300','AAAA;') 
insert into tb values('56','BBBB;') 
insert into tb values('56','CCCC;') 

create function test(@standards varchar(100)) 
returns varchar(8000) 
as 
begin 
declare @re varchar(500) 
set @re = '' 
select @re = @re+','+Reason 
from tb 
where @standards=standards 
return (stuff(@re,1,'')) 
end 

调用

代码如下:

 
select distinct standards,amount,variation,statuss,Reason = dbo.test('55') from tb where standards=55 
select distinct standards,Reason = dbo.test('56') from tb where standards=56 

今天的关于SQL Server:将几行数据合并为一行sql server 多行数据合并一行的分享已经结束,谢谢您的关注,如果想了解更多关于linux中将指定行数据合并为一行数据、mysql中将多行数据合并成一行数据、SQL 2008将具有相同ID的多行数据合并为一行、SQL Server Sql function 多行中的列合并为一行一列的方法的相关知识,请在本站进行查询。

本文标签: