【问题标题】:Oracle SQL Developer - Combining Cartesian Product, Count/Sum and Group ByOracle SQL Developer - 结合笛卡尔积、计数/总和和分组依据
【发布时间】:2012-05-20 00:16:54
【问题描述】:

我正在使用笛卡尔积加入 2 个表,如下所示。

select p.type, i.amount 
FROM products p, invoice i
where (p.account = i.id); -- column headers cant be changed despite having same info

这当然会显示 2 列和各自的值。

但是,我随后想使用 COUNT/GROUP BY 和 SUM/GROUP BY 进一步操作数据,但找不到任何可以使用 2 个表开始工作的相关示例。 (分开做是可以的,只是让他们一起工作才是问题所在)。

对于最终结果,我想显示 3 列显示 4 种类型的分组,每种类型下的条目数,以及每种类型的总金额/SUM,例如。

类型 - 类型计数 - 总值

A - 5 - 500

B - 6 - 1000

C - 1 - 50

D - 2 - 100

【问题讨论】:

  • 您尝试过哪些查询?出了什么问题?
  • 您的查询不再是笛卡尔积。这已经是一个内连接操作了

标签: sql oracle cartesian-product


【解决方案1】:

请记住,查询的结果在逻辑上等同于表或视图——它们都是零或多行与一或多列的投影。

一般而言,您可以根据选择对表执行哪些操作,也可以对查询或视图执行此操作。尽管有一些限制,您也可以像对表一样对视图和查询应用删除和更新。

如有疑问,请创建返回所需数据的查询,然后将其视为表:

select   type,
         count(type) count_type,
         sum(amount) sum(amount)
from     (select ... )
group by type

还要注意子查询因式分解子句,如果您需要多次引用相同的逻辑数据集,该子句具有特定的应用:

with my_data as(
    select ... )
select   type,
         count(type) count_type,
         sum(amount) sum(amount)
from     my_data
where    type in (select ... from my_data)
group by type

【讨论】:

    【解决方案2】:

    你试过了吗?

    select p.type, count(p.type) Cnt, sum(i.amoumt) Total
    FROM products p, invoice i
    where (p.account = i.id)
    group by p.type
    

    【讨论】:

    • 这工作完美。我已经尝试过非常相似的事情,但没有意识到我离解决方案有多近......谢谢
    • 请注意,如果您希望结果按 p.type 排序,那么仅依靠使用 GROUP BY 子句获得的任何意外排序是不够的。您需要明确使用 ORDER BY,因为 GROUP BY 并不总是排序。
    猜你喜欢
    • 2018-02-17
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-17
    • 2021-04-11
    • 2017-12-01
    • 2021-05-06
    相关资源
    最近更新 更多