【问题标题】:Sql server join by group?Sql server 按组加入?
【发布时间】: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

如果在同一日期有组 ab 使用左连接将它们显示在单行中

如果日期中只有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/stackoverflow/query/edit/82605

【问题讨论】:

    标签: sql-server tsql join left-join dataexplorer


    【解决方案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
    

    【讨论】:

    • 谢谢。有什么加入解决方案吗?
    • 哦,嘘** - 你是怎么做到的......?......你很棒。
    • 什么是触发你考虑全外连接的原因?
    • 哦,真的,没有必要:)。我不知道为什么。我猜是你提到的左右。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-13
    • 1970-01-01
    • 2020-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-20
    相关资源
    最近更新 更多