【问题标题】:Need to join and sum on sql tables需要对sql表进行join和sum
【发布时间】:2013-01-08 22:00:48
【问题描述】:

我正在尝试学习 Microsoft SQL Server,并且我正在尝试弄清楚如何做到以下几点。

我有两张桌子:

用户

id  fname   lname   username
111 kely    dike    kdike
222 hana    sho     hsho
333 mike    dime    mdime
444 sergi   xan     sxan

email_recipient

id  recipient_id    fname   lname
1      222          hana    sho
2      222          hana    sho
3      222          hana    sho
4      333          mike    dime
5      111          kely    dike
6      111          kely    dike
7      444          sergi   xan
8      444          sergi   xan
9      444          sergi   xan
10     444          sergi   xan

而我想做的是统计每个用户收到多少封电子邮件,如下所示:

id  fname   lname  username email_recipient total
111 kely    dike   kdike          2
222 hana    sho    hsho           3
333 mike    dime   mdime          1
444 sergi   xan    sxan           4

有人可以指出正确的方向吗?

【问题讨论】:

  • 为什么选择微软 sql? ANSI SQL 怎么样?

标签: sql sql-server join count sum


【解决方案1】:

你可以试试这个。

SELECT a.id, a.fname, a.lname, a.username, COUNT(*) AS email_recipient_total
FROM users a
INNER JOIN email_recipient b ON b.recipient_id = a.id
GROUP BY a.id, a.fname, a.lname, a.username

结果

|身份证 | FNAME |名称 |用户名 | EMAIL_RECIPIENT_TOTAL | -------------------------------------------------- -------- | 111 |凯利 |堤防|克迪克 | 2 | | 222 |花 |笑|萧 | 3 | | 333 |迈克 |一角钱 | mdime | 1 | |第444章塞尔吉 |珊 | sxan | 4 |

See it in action

【讨论】:

  • 知道答案为什么还要问这个问题?
  • @Bohemian 我问为什么是 Microsoft SQL
  • @njk 我们需要将它们按所有GROUP BY a.id, a.fname, a.lname, a.username 分组吗?我测试了你的小提琴,它适用于GROUP BY a.id
  • @sansix 小提琴在 MySQL 环境中进行了测试。 OP 使用的是 ANSI 标准的 MSSQL。
  • @njk 所以你的意思是说“它可能会在 MSSQL 上产生不同的结果”如果只使用GROUP BY a.id
【解决方案2】:

我的猜测是这可能会有更好的性能,但基本上是相同的答案:

SELECT 
  a.id, 
  a.fname, 
  a.lname, 
  a.username, 
  b.email_recipient_total
FROM users a
  INNER JOIN (
      select recipient_id, COUNT(*) AS email_recipient_total
      from email_recipient
      group by recipient_id
    ) b ON b.recipient_id = a.id

【讨论】:

    猜你喜欢
    • 2014-01-13
    • 2014-11-14
    • 2021-01-07
    • 1970-01-01
    • 2013-06-19
    • 2021-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多