在SQL Server 2008中,我希望创建一个在聚合中返回NULL的查询(如果存在),否则我会查找最大值。这是一个简化的例子......
我有以下数据:
CO Loc Term_Dt
1 A 7/15/2013
1 B
1 C 10/30/2000
2 A 8/10/2008
2 B 6/1/2015
2 C 4/30/2010
我要找的结果是:
CO Term_Dt
1 NULL
2 6/1/2015
因为从技术上讲,如果至少有一个地点尚未终止,公司仍然开放。
由于
答案 0 :(得分:5)
只需使用聚合和case
语句:
select co,
(case when count(term_dt) = count(*) then max(term_dt)
end) as term_dt
from table t
group by co;
count(<column>)
计算非NULL
值的数量。如果这与所有行不匹配,则至少有一行为NULL
。 else
不需要case
,因为默认值为NULL
。
答案 1 :(得分:1)
生成具有空术语日期的公司的子数据集,并将您的超级集合加入其中。第二个表中的任何非空的记录都要显示为null,因此请使用case语句。
这是有效的,因为我们的外表(A)返回
CO TERM_DT
1 7/15/2013
2 6/1/2015
但是我们的LEFT加入我们的内联视图也增加了B.Co ......
CO TERM_DT B.CO
1 7/15/2013 1
2 6/1/2015 NULL
所以你可以看到,当B.CO不为null而不是max(TERM_DT)时,我们想要显示NULL将产生所需的结果。这是使用案例陈述完成的。
SELECT A.Co,
Case when B.CO is not null then Max(A.Term_DT) else NULL end as Term_DT
FROM tableName A
LEFT JOIN (SELECT Distinct CO from tableName where Term_dt is null) B
on A.Co = B.CO
GROUP BY CO