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、创建表及插入数据:
(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列合并,可用以下语句:
结果为:
3、如果将id列和name列合并,则需要将id列转换成字符,语句如下:
结果如下:
参考技术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判断但是多了就不行了
我觉得这样的问题实际情况应该不会出现
就算出现了,你这个表建得太有问题了
基于 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_comment
和 comment
作为回复值 = Not Good
对于已发布的 content
值 = How are you doing?
来自 feed_item
表 它应该显示在下一个列作为对评论帖子的动态回复的一部分。从而自动为帖子的回复创建一个新列。威尔,你能帮我这样做吗?!
@Nishanthॐ,能否将其添加到您的预期输出中
没问题
@Nishanthॐ maria db 你的版本支持支点吗?以上是关于SQL怎么列合并的主要内容,如果未能解决你的问题,请参考以下文章