如何对 sql 连接进行聚合?

Posted

技术标签:

【中文标题】如何对 sql 连接进行聚合?【英文标题】:How to do aggregation on sql joins? 【发布时间】:2020-08-23 23:49:44 【问题描述】:

我有两张桌子

EXE1(文件夹、报告)

FOLDER | REPORT
Axis  | Savings
Axis  | Deposit
Icici | credit
Icici | debit 
Axis  | Savings

EXE2(文件夹、报告)

FOLDER | REPORT
Axis  | Savings
Axis  | Deposit
Icici | credit
Icici | debit 
Axis  | deposit
Icici | credit

我需要通过连接两个表格来计算报告

我尝试过的

Select exe1.folder,exe1.report,count(exe1.report) e1,count(exe2.report)e2
From Exe1 
  join Exe2 On exe1.folder=exe2.folder 
   And exe1.report=exe2.report
Where exe1.report='savings'
group by exe1.folder,exe1.report

这给出了输出

Folder | Report |e1 | e2
Axis   | Savings|2  | 2 

但我需要

Folder | Report |e1 | e2
Axis   | Savings|2  | 1 

谁能告诉我如何获得结果以及如何处理这种情况。

【问题讨论】:

请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入作为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出您可以给出的最少代码,即您显示的代码可以通过您显示的代码扩展为不正常。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)和输入为格式化为表的代码的 SQL。 How to Ask 停止尝试编写您的总体目标并从给定的代码中解释您的期望以及原因。 【参考方案1】:

你不懂count()。它计算表达式的非空值的行数。这就是为什么这两个值是相同的。您可以使用count(distinct) 修复您的逻辑:

select exe1.folder, exe1.report, count(distinct exe1.report) as e1,
       count(distinct exe2.report) as e2
from Exe1 join
     Exe2
     on exe1.folder = exe2.folder and exe1.report = exe2.report
where exe1.report='savings'
group by exe1.folder, exe1.report;

这可能不是解决问题的最有效方法。但是,如果您的计数很小,那么性能损失并不是很糟糕。通常最好在加入之前使用相关子查询或聚合

【讨论】:

但报告并不明显。它可以重复n次。请检查我的输入@Gordon。 @user9208802 。 . . count()exe2 中的主键。 @Gordon...你如何验证你的代码?是否有一些在线工具可以为您做到这一点?我看到很多看起来很有趣的问题,但是没有'CREATE TABLE...'和'INSERT INTO...'等等。你自己输入所有这些代码并回答无数问题,还是做你只要看看问题,你就会自动知道该怎么做?你不需要 CREATE TABLE 和 INSERT INTO 吗?只是好奇。谢谢。 @ASH 。 . .对于大多数问题,我阅读了问题并查看了 SQL。 太棒了!!

以上是关于如何对 sql 连接进行聚合?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过不同级别的枢轴聚合然后在pyspark中进行内部连接?

如何在 Teradata SQL 中使用 LEFT JOIN 对查询中的非聚合参数进行 GROUP BY?

SQL 移动聚合

如何在熊猫中对没有聚合功能的列进行分组?

利用Python进行数据分析-Pandas(第六部分-数据聚合与分组运算)

如何在 Promscale 的聚合查询中对标签进行分组