我有以下情况,我想从第一张桌子获取所有不同的记录&匹配来自第二和第二的记录对于非匹配显示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
请建议我提供所需的输出。
答案 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]