2012-10-17 52 views
1

我有这个表:Sql服务器按组加入?

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 

如果在同一天有一群ab表明两者在使用左单行加入

如果到目前为止,仅为a组,显示为单行(+ null在右侧一侧)

如果在日期th ERE只有B组,它显示为单线(+空在侧)

期望的结果:

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小提琴:

http://data.stackexchange.com/stackoverflow/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 
+0

谢谢。有没有_join_解决方案? –

+0

@RoyiNamir是的。请参阅编辑。 – podiluska

+1

oh sh ** - 你是怎么做到的?... ...你很棒。 –