使用 GROUP BY 和聚合函数的多个 INNER JOIN

Posted

技术标签:

【中文标题】使用 GROUP BY 和聚合函数的多个 INNER JOIN【英文标题】:Multiple INNER JOIN with GROUP BY and Aggregate Function 【发布时间】:2013-12-31 22:00:16 【问题描述】:

我带着另一个问题回来了。我已经修补了 1 天半,但仍然没有运气。所以我有下面的表格。

Table1
Field1 Field2 Field3 Field4     Field5
DR1    500    ID1    Active     TR1
DR2    250    ID2    Active     TR1
DR3    100    ID1    Active     TR1
DR4    50     ID3    Active     TR1
DR5    50     ID1    Cancelled  TR1
DR6    150    ID1    Active     TR2

Table2
Field1 Field3
ID1    Chris
ID2    John
ID3    Jane

Table3
Field1 Field2
TR1    Shipped  
TR2    Pending

我目前可以达到这个效果。

Name   Total
Chris  650    3
John   250    1
Jane   50     1

使用这条sql语句

SELECT t2.Field3 as Name , SUM(t1.Field2) as Total
 FROM [Table1] t1 INNER JOIN [Table2] t2 ON t1.Field3 = t2.Field1
  GROUP BY t2.Field3

但是,我想实现如下所示的结果。

Chris 600 2
John  250 1
Jane  50  1

我想先检查表 3,如果它有一个“已发货”字段 2,然后它包括表 1 中的所有内容和“活动”字段 4。它不应包括“已取消”字段 4。如果 Table3 有一个 Pending 的 Field2,它也不应该包含它。我会很感激任何一点帮助。谢谢。

【问题讨论】:

你错过了一些信息。什么是“3-1-1”?在您的选择中,您仅查询 2 个字段(名称和总和)。什么是650?克里斯:500+100+50+150 = 800 您可以将这些条件添加到您的查询中: WHERE Table1.Field5 = 'TR1' AND Table1.Field4 = 'Active' ,当然,在 GROUP BY 语句之前 抱歉,3-1-1 是 COUNT(*)。 @BaBL86 @wxyz,是的,这就是这样做的方法,但是我不能做 WHERE 条件,除非我首先通过执行 INNER JOIN 将 Table3 连接到 Table1,现在它已经在使用 1 INNER JOIN对于表 2。我不知道将 Table3 的第二个 INNER JOIN 放在哪里 【参考方案1】:

好吧,你只需要连接所有需要在 where 子句中包含所需字段的表。

并添加一个where 子句。

SELECT t2.Field3,
       SUM(t1.Field2) as CTotal,
       count(*) as NbItems
FROM Table1 t1 

INNER JOIN Table2 t2
       ON t1.Field3 = t2.Field1
--add a join on Table3
INNER JOIN Table3 t3 
       ON t3.Field1 = t1.Field5 
--add your where clause
WHERE t1.Field4 = 'Active'
AND t3.Field2 <> 'Pending'
GROUP BY t2.Field3
--ORDER BY CTotal DESC

见SqlFiddle

编辑

针对你的问题

SELCT custInfo.CName, 
Count(*) as TransactionCount, 
SUM(CTotal) as TransactionTotal 
FROM (TamarawTransaction trans 
INNER JOIN TamarawCustomerInformation custInfo 
    ON trans.CCustomerCode=custInfo.CCustomerCode) 
INNER JOIN TamarawTrip  trip
    ON trans.CTrip=trip.CTrip 

Where trip.CStatus='Finalized' 
AND trans.CStatus='Active' 
GROUP BY custInfo.CName

使用“奇怪的访问连接语法”

SELECT TamarawCustomerInformation.CName, 
Count(*) AS TransactionCount, 
SUM(CTotal) AS TransactionTotal
FROM TamarawCustomerInformationn 
INNER JOIN (TamarawTrip INNER JOIN TamarawTransaction ON TamarawTrip.CTrip=TamarawTransaction.CTrip) 
          ON TamarawCustomerInformationn.CCustomerCode=TamarawTransaction.CCustomerCode
WHERE TamarawTrip.CStatus='" & "Shipped" & "' and TamarawTransaction.CStatus='" & "Active" & "'
GROUP BY TamarawCustomerInformation.CName;

【讨论】:

您好,先生,感谢您的回复。我已经做了你的陈述。这是我的原创。选择 TamarawCustomerInformation.CName,Count(*) 作为 TransactionCount,SUM(CTotal) 作为 TransactionTotal from TamarawTransaction INNER JOIN TamarawCustomerInformation ON TamarawTransaction.CCustomerCode=TamarawCustomerInformation.CCustomerCode INNER JOIN TamarawTrip ON TamarawTransaction.CTrip=TamarawTrip.CTrip where TamarawTrip.CStatus='" & "已发货" & "' 和 TamarawTransaction.CStatus='" & "活动" & "' GROUP BY TamarawCustomerInformation.CName。它说语法错误:( @chris_techno25 没有 where 子句,你有语法错误吗? 感谢您的耐心,先生,是的,仍然存在语法错误,它显示在第一个 INNER 连接和第二个之间。我读过 w3schools sql 语法课程和其他网站。我似乎找不到我的陈述有什么问题。只有 1 个 INNER JOIN,它可以工作,然后我添加了 2nd INNER JOIN,现在它不起作用。我想我应该给它一个逗号,但它仍然不起作用。 :( 还是一样的先生 :( 现在这是我的声明。“选择 TamarawCustomerInformation.CName, Count(*) as TransactionCount, SUM(CTotal) as TransactionTotal from TamarawTransaction T1 INNER JOIN TamarawCustomerInformationn C1 ON T1.CCustomerCode =C1.CCustomerCode INNER JOIN TamarawTrip T2 ON T1.CTrip=T2.CTrip where T2.CStatus='" & "Finalized" & "' and T1.CStatus='" & "Active" & "' GROUP BY C1.CName" @chris_techno25 你能给出完整的错误信息吗?顺便问一下,你的 dbms 是什么?

以上是关于使用 GROUP BY 和聚合函数的多个 INNER JOIN的主要内容,如果未能解决你的问题,请参考以下文章

group by 多个字段

可以这样去理解group by和聚合函数

聚合函数 和 group by

(转)可以这样去理解group by和聚合函数

mysql 可以group by 两个字段吗

group by 后面可以带两个字段吗