缓慢的一天....可以使用一些协助编写简单的ANSI SQL查询。
我有一个家庭内的个人名单(名字和姓氏),第二张表格列出了这些人的一部分。我想创建一个第三个表,如果第二个表中没有列出任何个人,则会标记一个家庭中的每个人。目标主要是标记"不完整"家庭。
下面是两个输入表和所需第三个表的示例。
正如我所说的......非常简单......有一个缓慢的一天。谢谢!
答案 0 :(得分:1)
我想你想要一个left join
和case
表达式:
select t1.*,
(case when t2.first_name is null then 'INCOMPLETE' else 'OK' end) as flag
from table1 t1 left join
table2 t2
on t1.first_name = t2.first_name and t1.last_name = t2.last_name;
当然,这标志着“Diane Thomson”为“OK”,但我认为这是一个错误。
编辑:
哦,我明白了。姓氏定义了家庭(这似乎是一个非常大的假设)。但你可以用窗口函数来做到这一点:
select t1.*,
(case when count(t2.first_name) over (partition by t1.last_name) =
count(*) over (partition by t1.last_name)
then 'OK'
else 'INCOMPLETE'
end) as flag
from table1 t1 left join
table2 t2
on t1.first_name = t2.first_name and t1.last_name = t2.last_name;
答案 1 :(得分:0)
这并不简单,至少在SAS中没有: - )
标准SQL,支持窗口聚合时:
select ft.*,
-- counts differ when st.first_name is null due to the outer join
case when count(*) over (partition by ft.last_name)
= count(st.first_name) over (partition by ft.last_name)
then 'OK'
else 'INCOMPLETE'
end
from first_table as ft
left join second_table as st
on ft.first_name = st.first_name
and ft.last_name = ft.last_name
否则你需要一个标准聚合并加入回来:
select ft.*, st.flag
from first_table as ft
join
(
select ft.last_name,
case when count(*)
= count(st.first_name)
then 'OK'
else 'INCOMPLETE'
end as flag
from first_table as ft
left join second_table as st
on ft.first_name = st.first_name
and ft.last_name = st.last_name
group by ft.last_name
) as st
on ft.last_name = st.last_name
答案 2 :(得分:0)
如果您希望利用其非ANSI SQL功能自动将聚合函数结果重新合并到详细记录中,那么在SAS中很容易做到。
select
a.first
, a.last
, case when 1=max(missing(b.last)) then 'INCOMPLETE'
else 'OK'
end as flag
from table1 a left join table2 b
on a.last=b.last and a.first=b.first
group by 2
order by 2,1
;