SQL怎么列合并

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL怎么列合并相关的知识,希望对你有一定的参考价值。

第一个表数据:
A 0 1
B 0 6
C 0 4
第二个表数据:
A 2 0
B 3 0
C 8 0

如何得到
A 2 1
B 3 6
C 8 4

求大神赐教

1、我用Toad做演示,我先新建两张table,create table #AA(ID int,name nvarchar(10),age int)

create table #BB(ID int,name nvarchar(10),age int )。


2、分别向两张table插入三条数据,可以用两个班来理解A班有三个学生,B班也有三个学生,为下一步sql语句做准备

insert into #AA select 1,N'张三',10,insert into #AA select 2,N'李四',10

insert into #AA select 3,N'王五',11,insert into #BB select 1,N'张A',10

insert into #BB select 2,N'李B',11,insert into #BB select 3,N'王C',12

3、现在要求AB两个班找出年龄等于10岁的同学,最直接的方法就是:

select * from #AA where age=10

select * from #BB where age=10

但是这样会产生两个结果集,结果不直观

4、接下来用union将这两条sql语句合并起来,F5执行之后,就会发现变成一个结果集。

select * from #AA where age=10

union

select * from #BB where age=10

5、还有一种不用union的做法,sql语句这样写:

select  a.*,b.* from #AA a inner join #BB b on a.age=b.age 

where a.age=10 and b.age=10

6、对比join与union,可以发现union是完全的结果累加,相当于完美合并,join是属于条件连接。

参考技术A

看列的具体类型,如果都是字符型数,直接用“+”连接即可,如果含有其他类型,需要转换成字符类型再用“+”连接。

1、创建表及插入数据:

create table test
(id int,
name varchar(10),
class varchar(10),
sal money)
insert into test values (1,'张三','一班',100)
insert into test values (2,'李四','一班'200.33)
insert into test values (3,'王五','二班'200.444)
insert into test values (4,'赵六','二班'300.88888)

2、将name列与class列合并,可用以下语句:

select name+class from test

结果为:

3、如果将id列和name列合并,则需要将id列转换成字符,语句如下:

select cast(id as varchar)+name from test

结果如下:

参考技术B select a.第1列,b.第2列,a.第3列 from a,b where a.第1列=b.第1列追问

如果第1列值有空的该如何做,比如上面的例子,C是空的,怎么合并起来?

追答

可以用 Right Join这样就返回B表所有的值
select B.第1列,b.第2列,a.第3列 from a right join b on a.第1列=b.第1列

追问

这样还是不能处理空值吧,null是不能用 = 来操作的,而且我有多列空值也是行不通

追答

你说的C空值是上面意思?
A表吗?具体点

追问

A表数据,三行三列:
A 0 1
B 0 6
null 0 4

B表数据,三行三列:
A 2 0
B 3 0
null 8 0

如何合并成
A 2 1
B 3 6
null 8 4

追答

那肯定不行了,这个是关联字段肯定空了就不行了
那我们怎么关联这两个表呢?
一个为null还可以用case when判断但是多了就不行了
我觉得这样的问题实际情况应该不会出现
就算出现了,你这个表建得太有问题了

本回答被提问者采纳
参考技术C select a.col1,max(a.clo2),max'(a.clo3) from (select * from table1 union select * from table2 ) a group by a.col1 参考技术D select a.列2,b.列3 from 表1 a,表2 b where a.列1=b.列1

基于 SQL 中的行 ID 合并列的问题

【中文标题】基于 SQL 中的行 ID 合并列的问题【英文标题】:An Issue with merging columns based on the row ID in SQL 【发布时间】:2019-03-19 11:27:22 【问题描述】:

我需要基于列名称为ID 的行合并comment 列我有一个SQL 查询,以便合并对评论帖子的回复,考虑到回复帖子的计数值,即comment_counts。我需要在新闻提要帖子的单个线程中显示嵌套的 cmets。下面是我的 SQL 查询

SELECT DISTINCT ft.ID as ID, ft.userid, ft.content, ft.timestamp, ft.comments as comment_counts, ftc.comment, ftc.timestamp as comment_timestamp, uq.username, uq.avatar 
FROM users uq, feed_item ft 
LEFT JOIN feed_item_comment ftc ON ftc.postid = ft.ID 
LEFT JOIN user_friends uf ON uf.friendid = ftc.userid 
LEFT JOIN users u ON u.ID = uf.friendid WHERE uq.ID = ft.userid AND ft.userid
IN 
(SELECT u.ID FROM users u WHERE u.ID 
    IN (SELECT uf.friendid FROM user_friends uf WHERE uf.status = '2' AND uf.userid = '".$this->user->info->ID."') 
        OR 
        u.ID 
        IN (SELECT uf.userid FROM user_friends uf WHERE uf.status = '2' AND uf.friendid = '".$this->user->info->ID."') 
        OR
        u.ID = '".$this->user->info->ID."'
) ORDER BY ft.ID DESC, ftc.timestamp DESC

实际结果:

这是从上述查询获得的结果

ID  userid      content                 timestamp   comment_counts  comment         comment_timestamp       username        avatar   
___________________________________________________________________________________________________________________________________________

3   1           This is manju           13:12:31        2           manju comment   13:17:31                manju           1698862132.png   
3   1           This is manju           13:12:31        2           new cmt         14:00:15                manju           1698862132.png   
2   14          How are you doing?      13:06:42        2           Fine            15:00:15                Nishanth        default.png   
2   14          How are you doing?      13:06:42        2           Not Good        15:05:10                Nishanth        default.png   
1   14          How are you?            14:07:00        2           Look Good       20:00:00                Nishanth        default.png   
1   14          How are you?            14:07:00        2           So I'm!         20:10:00                Nishanth        default.png  

对于具有多个 cmets 的单个新闻提要帖子显示在具有嵌套 cmets 的单独提要中。 尽管嵌套的 cmets 反复显示。但有单独的新闻提要线程

预期结果

ID  userid  content             timestamp   comment_counts  comment1        comment1_timestamp  comment2    comment2_timestamp  username    avatar   
_______________________________________________________________________________________________________________________________________________________

3   1       This is manju       13:12:31        2           manju comment   13:17:31            new cmt     14:00:15            manju       1698862132.png   
2   14      How are you doing?  13:06:42        2           Fine            15:00:15            Not Good    15:05:10            Nishanth    default.png   
1   14      How are you?        14:07:00        2           Look Good       20:00:00            So I'm!     20:10:00            Nishanth    default.png   

我只需要显示嵌套的 cmets(不重复),只有一个新闻帖子作为线程 例如,对于带有“你好吗”消息的单个新闻提要,正如我用“很好”和“不好”评论的那样 对于帖子“你好吗”,它重复了两次。因为我用文字“很好”和“不好”评论了两次 我应该如何防止嵌套的 cmets 在单个新闻提要中作为线程重复两次。

通过使用GROUP_CONCAT(ftc.comment) as replies

ID userid   content         timestamp     comment_counts   comment      comment_timestamp   username   avatar           replies  
__________________________________________________________________________________________________________________________________________________________________________

1   14      How are you?    14:07:00            2           Look Good   20:00:00            Nishanth   default.png   Look Good,Fine,Not Good,manju comment,new cmt,Look...

使用查询完成数据库:

SQL Fiddle DEMO

使用GROUP_CONCAT(ftc.comment) 作为回复

ID userid   content         timestamp     comment_counts   comment      comment_timestamp   username   avatar           replies  
__________________________________________________________________________________________________________________________________________________________________________

1   14      How are you?    14:07:00            2           Look Good   20:00:00            Nishanth   default.png   Look Good,Fine,Not Good,manju comment,new cmt,Look...

我应该如何编写 SQL 查询,以便从获得的结果中合并行以获得所需/预期的结果?

【问题讨论】:

您可能需要阅读数据透视表。尽管您想要做的不是典型的枢轴,但您仍在尝试将行转换为列,这就是枢轴所做的。 你的mysql版本是什么@nishanth MariaDB 服务器版本:10.1.36 @fa06 【参考方案1】:

在下面尝试使用 row_number() 和条件聚合

DEMO

select id, userid,content,timestamp,comment_count,
min(case when seq=1 then comment end) as comment1,
min(case when seq=1 then comment_timestamp end) as commenttime1,
min(case when seq=2 then comment end) as comment2,
min(case when seq=2 then comment_timestamp end) as commenttime2
from
(
select *,row_number() over(partition by id,userid order by comment_timestamp) as seq from 
(SELECT DISTINCT ft.ID as ID, ft.userid, ft.content, ft.timestamp, ft.comments as comment_count, ftc.comment, ftc.timestamp as comment_timestamp, uq.username, uq.avatar FROM users uq,
feed_item ft 
LEFT JOIN feed_item_comment ftc ON ftc.postid = ft.ID
LEFT JOIN user_friends uf ON uf.friendid = ftc.userid 
LEFT JOIN users u ON u.ID = uf.friendid WHERE uq.ID = ft.userid AND ft.userid
IN 
(SELECT u.ID FROM users u WHERE u.ID 
IN (SELECT uf.friendid FROM user_friends uf WHERE uf.status = '2' AND uf.userid = 1) 
OR u.ID IN 
(SELECT uf.userid FROM user_friends uf WHERE uf.status = '2' AND uf.friendid = 1) 
OR
u.ID = 1
)ORDER BY ft.ID DESC, ftc.timestamp DESC)X)Y
group by id, userid,content,timestamp,comment_count

【讨论】:

感谢您的辛勤努力。查询工作正常。但是对于帖子的回复和时间戳的动态值,即comment_count> 2。我应该如何处理您的查询因为我已经附加了(7、2、14,'在你所有的努力之后还不错!',' 08:13:10', 0, 0, 0);到feed_item_comment 表Click Here 对于 feed_item_commentcomment 作为回复值 = Not Good 对于已发布的 content 值 = How are you doing? 来自 feed_item 表 它应该显示在下一个列作为对评论帖子的动态回复的一部分。从而自动为帖子的回复创建一个新列。威尔,你能帮我这样做吗?! @Nishanthॐ,能否将其添加到您的预期输出中 没问题 @Nishanthॐ maria db 你的版本支持支点吗?

以上是关于SQL怎么列合并的主要内容,如果未能解决你的问题,请参考以下文章

SQL 两张表合并 (两张表的列都相同)

有难度的sql相同列值合并行

如果列 x 是重复记录,则合并列 a、b、c - SQL

sql server 中有一张表,我想把表中两列的数据合并后插入本表中另一列!请问怎么实现

SQL 多行多列数据清洗合并为一行

mybatis查询结果如何合并为列表