【问题标题】:how to join two tables and count occurrences some values?如何连接两个表并计算出现的一些值?
【发布时间】:2013-02-26 22:38:03
【问题描述】:

我请求帮助是因为我不太了解 SQL。

我需要连接两个表并计算第二个表中的一些值的出现次数,以达到类似统计表的效果,其中包含列:

结果表:

  • 国家/地区 varchar(20),
  • 站点 varchar(20),
  • suspected_violation long,
  • confirmed_violation long,
  • confirmed_no_violation long,
  • not_determined long,
  • 总长

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

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

所以,我有两个表:Violations 和 Status。

违规:

  • id 长,
  • 国家/地区 varchar(20),
  • 站点 varchar(20),
  • status_id long,
  • ...在这种情况下其他不重要的列

状态:

  • id 长,
  • 状态长 “状态”列的值 (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 查询,因为这样做有很大的问题。

【问题讨论】:

  • 你已经尝试了什么?
  • 你提到的图片在哪里?
  • 由于 stacoverflow 信誉限制,我无法添加图片。我已经添加了我的伪代码

标签: sql join count


【解决方案1】:

您应该能够使用带有 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

【讨论】:

  • 请问这个INNER JOIN是干什么用的?
  • @PM77-1 您会注意到我添加了第二个查询,因为不需要INNER JOIN,除非您想在结果中使用任何status 表数据。在第一个查询中,您可以在CASE 表达式中使用s.id 而不是v.status_id
  • 谢谢,你的解决方案对我没有高级 SQL 真的很有帮助!
  • 在hibernate中使用这个查询怎么样?可能吗?因为现在我收到错误:意外令牌:Total_SuspectedViolations 等...
  • @Roman 我建议发布一个新问题并在其上包含正确的标签,这样您就可以获得合适的受众。
猜你喜欢
  • 2013-02-27
  • 1970-01-01
  • 2011-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-29
  • 1970-01-01
相关资源
最近更新 更多