如何连接两个表并计算出现一些值?

时间:2013-03-11 16:42:07

标签: sql join count

我要求帮助,因为我不太了解SQL。

我需要连接两个表并从第二个表中计算出现一些值以实现类似于将具有coluns的统计表的效果:

结果表:

  • country varchar(20),
  • site varchar(20),
  • susp_violation long,
  • confirmed_violation long,
  • confirmed_no_violation long,
  • not_determined long,
  • 总长

我的结果表需要有前两列(contry和site)来自第一个表“Violations”和接下来的5个列,它们将包含每个可能的id值中“Violations”中出现的status_id数量(count)状态表。

现在我可以上传我想要实现的表结果图像: Result Table

所以,我有两个表:违规和状态。

违反:

  • id long,
  • country varchar(20),
  • site varchar(20),
  • status_id long,< - 这是状态表中的状态ID。
  • ...在这种情况下不重要的其他列

状态:

  • id long,
  • 状态很长 列“status”具有值(1-4),它们映射到字符串值:可疑违规(1),确认违规(2),确认无违规(3),未确定(4)

我的联接结果是要有一个应该包含列的表:

  • 来自违规表:“国家”和“网站”
  • 来自状态表:“可疑违规”,“确认违规”,“确认无违规”,“未确定”,“总计”(此列为违规表中出现的计数器)。

我的伪代码和抽象尝试:

SELECT v.country, v.site, count(v.status_id == 1), count(v.status_id == 2), count(v.status_id == 3), count(v.status_id == 4)
FROM Violations v JOIN Status s 
ON v.status_id=s.id
GROUP BY v.country, v.site

请求帮我编写正确的sql查询,因为这样做有很大的问题。

1 个答案:

答案 0 :(得分:2)

您应该能够使用带有CASE表达式的聚合函数来获得结果:

select v.country,
    v.site,
    SUM(case when s.id = 1 then 1 else 0 end) Total_SuspectedViolations,
    SUM(case when s.id = 2 then 1 else 0 end) Total_ConfirmedViolations,
    SUM(case when s.id = 3 then 1 else 0 end) Total_ConfirmedNoViolations,
    SUM(case when s.id = 4 then 1 else 0 end) Total_NotDetermined,
    COUNT(*) Total
from violations v
inner join status s
    on v.status_id = s.id
group by v.country, v.site

请参阅SQL Fiddle with Demo

这也可以在没有JOIN

的情况下编写
select v.country,
    v.site,
    SUM(case when v.status_id = 1 then 1 else 0 end) Total_SuspectedViolations,
    SUM(case when v.status_id = 2 then 1 else 0 end) Total_ConfirmedViolations,
    SUM(case when v.status_id = 3 then 1 else 0 end) Total_ConfirmedNoViolations,
    SUM(case when v.status_id = 4 then 1 else 0 end) Total_NotDetermined,
    COUNT(*) Total
from violations v
group by v.country, v.site

请参阅SQL Fiddle with Demo