Sql server 按组加入?
Posted
技术标签:
【中文标题】Sql server 按组加入?【英文标题】:Sql server join by group? 【发布时间】:2012-10-07 11:31:54 【问题描述】:我有这张桌子:
id | type | date
1 | a | 01/1/2012
2 | b | 01/1/2012
3 | b | 01/2/2012
4 | b | 01/3/2012
5 | a | 01/5/2012
6 | b | 01/5/2012
7 | b | 01/9/2012
8 | a | 01/10/2012
POV 是每个日期。如果 2 行包含相同的日期,则两者都将在同一行中可见(左连接)。
同一日期最多可共享 2 行。
所以这种情况不可能:
1 | a | 01/1/2012
2 | b | 01/1/2012
3 | a | 01/1/2012
如果在同一日期有组 a
和 b
使用左连接将它们显示在单行中
如果日期中只有a
组,则将其显示为单行(在右侧一侧为+null)
如果 date 中只有 b 组,则显示为单行(left 侧的 +null )
想要的结果:
Date |typeA|typeB |a'id|b'id
01/1/2012 | a | b | 1 | 2
01/2/2012 | | b | | 3
01/3/2012 | | b | | 4
01/5/2012 | a | b | 5 | 6
01/9/2012 | | b | | 7
01/10/2012 | a | | 8 |
我知道这很简单,但这里加入的主要锚点是日期。 我遇到的问题是当我阅读第 1 行时,我在表中搜索具有相同日期的所有行......很好。 - 没关系。
但是当我阅读第二行时,我也这样做了,它产生了第一行 - 已经被计算在内了......
有什么帮助吗?
这里是 sql 小提琴:
https://data.stackexchange.com/***/query/edit/82605
【问题讨论】:
【参考方案1】:我想你想要一个pivot
select
[date],
case when [a] IS null then null else 'a' end typea,
case when [b] IS null then null else 'b' end typeb,
a as aid,
b as bid
from yourtable src
pivot (max(id) for type in ([a],[b]))p
如果你想用连接来做到这一点..
select ISNULL(a.date, b.date), a.type,b.type, a.id,b.id
from
(select * from yourtable where type='a') a
full outer join
(select * from yourtable where type='b') b
on a.date = b.date
【讨论】:
谢谢。有什么加入解决方案吗? 哦,嘘** - 你是怎么做到的......?......你很棒。 什么是触发你考虑全外连接的原因? 哦,真的,没有必要:)。我不知道为什么。我猜是你提到的左右。以上是关于Sql server 按组加入?的主要内容,如果未能解决你的问题,请参考以下文章