【问题标题】:SQL JOINT and COUNTSQL 联接和计数
【发布时间】:2016-03-03 09:06:01
【问题描述】:

我有 2 张桌子:

  • r1 : 主键 k1 ;
  • r2 : 二级密钥 k1(来自 r1 表)重复授权

因此,r2 可以有几行以 k1 作为辅助键,例如可以在其上执行 SUM。

我的问题是当我尝试时

select
  r1.col_n,
  sum(r2.col_m),
  **count(*)as total**
from
  r1,r2
where
  r1.k1 = r2.k1

这里的 COUNT(*) 将返回出现次数或 r2.k1 我知道这是它应该做的,这就是查询的意思。

我的问题是(不要问我为什么,因为 r1 中有很多辅助键...大声笑)我希望 COUNT() 返回该联合查询中 r1.k1 的​​出现次数而不是 r2.k1 ...我需要 r1 上的 sum(r2.col_m) 和 count() ...

你能帮我吗?

【问题讨论】:

  • 请仅使用您正在使用的 SQL 数据库标记您的问题。
  • 我总是喜欢抽我的 SQL 联合 ;-)

标签: mysql sql sql-server sqlite


【解决方案1】:

您可以使用 DISTINCT:

select
  r1.col_n,
  sum(r2.col_m),
  count(DISTINCT r1.k1) as total
from
  r1 INNER JOIN r2 ON r1.k1 = r2.k1
  • COUNT(*) 将对所有行进行计数(r1 中的所有行乘以 r2 中连接成功的所有行)
  • COUNT(r1.k1) 将计算 r1.k1 不为空的所有行,但仍会乘以 r2 中连接成功的所有行
  • COUNT(DISTINCT r1.k1) 将计算 r1.k1 的​​所有不同值

还有其他选择(例如,使用子查询进行计数,然后使用 r2 加入此子查询)但 COUNT(DISTINCT r1.k1) 应该足以解决您的问题。

另外,最好使用 JOIN,所以我转换了:

FROM r1, r2
WHERE r1.k1=r2.k2

使用这种语法:

FROM
  r1 INNER JOIN r2
  ON r1.k1=r2.k2

【讨论】:

  • 真棒兄弟它的工作原理......我知道 DISTINCT 但我可以问我在这里缺少什么吗?
  • @MichaelJohnson 嗨,我已经更新了我的答案并添加了更多细节,如果一切都清楚,请告诉我
  • 好吧....我不知道 COUNT 是“智能”...我虽然它只会计算 SELECT 结果集中给定项目的出现次数。当您说 _COUNT(DISTINCT r1.k1) 将计算 r1.k1 的​​所有不同值时,我理解这意味着在 r2.k1 中找到的 r1.k1 的​​不同值。我当时就明白了,现在这一切对我来说都很有意义。再次感谢您...特别是您解释详细信息。
  • 我发现techonthenet.com/sql/count.phpmsdn.microsoft.com/en-us/library/ms175997.aspx 现在都清楚了。再次感谢您
猜你喜欢
  • 1970-01-01
  • 2013-07-19
  • 2017-01-30
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多