写出一个复杂的SQL步骤( 二 )

最后一步:按照条件:“仅显示平均呼叫持续时间大于所有呼叫的平均呼叫持续时间的国家”,我们可以很容易得出,查询最后的结果需要用HAVING对聚合结果做下过滤,因为“所有呼叫的平均呼叫持续时间”和“均呼叫持续时间”我们已经统计出来了,因此大于长这样:
HAVING AVG(ISNULL(DATEDIFF(SECOND, call.start_time, call.end_time),0)) > (SELECT AVG(DATEDIFF(SECOND, call.start_time, call.end_time)) FROM call)所以最后的SQL长这样:
--返回所有国家以及相关呼叫的数量及其平均持续通话时间(以秒为单位) 。在结果中,仅显示平均呼叫持续时间大于所有呼叫的平均呼叫持续时间的国家 。SELECT     country.country_name,    SUM(CASE WHEN call.id IS NOT NULL THEN 1 ELSE 0 END) AS calls,    AVG(ISNULL(DATEDIFF(SECOND, call.start_time, call.end_time),0)) AS avg_diffFROM country -- 使用LEFT JOIN包括没有任何呼叫的国家LEFT JOIN city ON city.country_id = country.idLEFT JOIN customer ON city.id = customer.city_idLEFT JOIN call ON call.customer_id = customer.idGROUP BY     country.id,    country.country_name-- 过滤掉不符合条件的结果HAVING AVG(ISNULL(DATEDIFF(SECOND, call.start_time, call.end_time),0)) > (SELECT AVG(DATEDIFF(SECOND, call.start_time, call.end_time)) FROM call)三.总结步骤

  1. 先明确需求
  2. 拆解展示字段和条件
  3. 确定所要用到的表
  4. 先写出整体框架SQL并打印结果看数据很重要这一步
  5. 创建子查询,并且测试结果 , 最后添加到整体框架SQL中
  6. 测试验证所有数据
  7. 添加备注,复杂SQL不写备注等于没写




推荐阅读