【问题标题】:SQL Counting and JoiningSQL 计数和连接
【发布时间】:2011-03-15 01:59:25
【问题描述】:

这学期我要参加数据库课程,我们正在学习 SQL。我了解大多数简单的查询,但我在使用 count 聚合函数时遇到了一些困难。

我应该将广告编号与物业编号与分支机构编号相关联,以便我可以按分支机构编号计算广告数量并计算其成本。我设置了我认为是两个合适的新视图,但我不知道要为 select 语句写什么。我以正确的方式接近这个吗?我有一种感觉,我已经过度复杂化了这个大时代......

with ad_prop(ad_no, property_no, overseen_by) as
  (select a.ad_no, a.property_no, p.overseen_by
   from advertisement as a, property as p
   where a.property_no = p.property_no)
with prop_branch(property_no, overseen_by, allocated_to) as
  (select p.property_no, p.overseen_by, s.allocated_to
   from property as p, staff as s
   where p.overseen_by = s.staff_no)

select distinct pb.allocated_to as branch_no, count( ??? ) * 100 as ad_cost

from prop_branch as pb, ad_prop as ap
where ap.property_no = pb.property_no
group by branch_no;

任何见解将不胜感激!

【问题讨论】:

  • 感谢@PortableWorld 正确格式化我的代码!
  • 没问题。共同监督。我只是希望我知道你的问题的答案。

标签: sql join count


【解决方案1】:

你可以这样简化:

广告
- ad_no
- property_no

房产
- property_no
- 监督人

员工
- 员工编号
- 分配给

SELECT s.allocated_to AS branch, COUNT(*) as num_ads, COUNT(*)*100 as ad_cost 
FROM advertisement AS a
INNER JOIN property AS p ON a.property_no = p.property_no
INNER JOIN staff AS s ON p.overseen_by = s.staff_no
GROUP BY s.allocated_to;

更新:以上更改以满足您的架构需求

【讨论】:

    【解决方案2】:

    您可以将 WITH 子句压缩为单个语句。然后,我认为您缺少的部分是如果列定义中引用的列未包含在 GROUP BY 子句中,则必须聚合它们。因此,您按不同的列分组,然后在列定义中应用聚合和数学。

    SELECT
       s.allocated_to AS branch_no
      ,COUNT(a.ad_no) AS ad_count
      ,(ad_count * 100) AS ad_cost
    ...
    GROUP BY s.allocated_to
    

    【讨论】:

      【解决方案3】:

      我可以告诉你,你把它弄得太复杂了。它应该是一个带有几个连接的 select 语句。您应该重新阅读有关连接的章节或查看以下链接

      http://www.sql-tutorial.net/SQL-JOIN.asp

      join 允许您基于 基于 两个表之间的公共键“组合”来自两个表的数据(您可以将更多表与更多 加入)。一旦你有了这个“连接”的表,你就可以假装它真的是一个表(别名用于指示该列的来源)。您了解聚合如何在单个表上工作吗?

      我不想给你答案,这样你才能真正学习:)

      【讨论】:

      • 所以我根据三个表的共同属性加入三个表,按branch_id分组,然后统计每个branch_id出现的次数?
      • 是的 :) 听起来你现在明白了
      • 谢谢,我今天开始对这些概念有了更好的理解!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多