如何从第一张桌子和第一张桌子中选择行匹配另一个表中的条目?

时间:2017-04-03 13:46:12

标签: sql sql-server tsql

我有以下情况,我想从第一张桌子获取所有不同的记录&匹配来自第二和第二的记录对于非匹配显示0,

Table1
id  group
1   a
2   b
3   c
4   a
5   b

表1有组数据,

Table2
m_id    group   Available  Flag
1         a      100       A
2         a      200       A
2         b      100       A
3         b      150       A
3         c      280       A
4         a      -50       D
4         b      20        D

表2具有按组分组提供的项目数据,

我希望群组列表包含Flag = A或不可用的项目, 期望的输出,

m_id    group   Available
1        a       100
1        b       0
1        c       0
2        a       200
2        b       100
2        c       0
3        a       0
3        b       150
3        c       280

我通过左连接尝试了这个但是没有提供所需的输出。

select t2.M_ID,t1.GROUP,t2.Available 
    from #temp as t1
    left join #temp2 as t2 on t1.GROUP=t2.GROUP AND t2.flag='A'
    group by t2.M_ID,t1.GROUP,t2.Available

输出是,

  M_ID  GROUP   Available
   1    a        100
   2    a        200
   2    b        100
   3    c        280
   3    b        150

请建议我提供所需的输出。

2 个答案:

答案 0 :(得分:4)

使用cross join生成所有行,然后使用left join来生成值:

select m.M_ID, g.GROUP, coalesce(t2.Available, 0) as Available
from #temp g cross join
     (select t2.m_id
      from #temp2 t2
      where flag = 'A'
      group by t2.m_id
     ) m left join
     #temp2 t2
     on t2.GROUP = g.GROUP and t2.m_id = m.m_id;

根据您的示例数据,#temp2中没有重复项,因此不需要聚合。当然,如果你有重复项,那么很容易进行聚合。

答案 1 :(得分:0)

    create table Table1 (id int, [group] char(1))
    insert table1 values(1,'a'),(2,'b'),(3,'c')

    create table Table2 (m_id int, [group] char(1), Available int)
    Insert Table2 values (1,'a',100),(2,'a',200),(2,'b',100),(3,'b',150),(3,'c',280)

    select distinct t2_1.m_id, t1.[group], isnull(t2_2.Available,0) as Available
    from Table2 t2_1 cross join table1 t1
    left join Table2 t2_2 on t2_1.m_id=t2_2.m_id and t2_2.[group]=t1.[group]