【问题标题】:Join count query into one将计数查询合二为一
【发布时间】:2022-01-05 02:25:47
【问题描述】:

我想将两个非常简单的计数查询合并为一个。

为了澄清情况,我将添加我得到的表格:

isbn author
1111 GB
2222 DC
3333 RL

作者

code Name
GB George B.
KL Kyle L.
DC Donald C.
RL Roland L.

共同作者

name isbn
KL 1111
GB 2222
GB 3333

我提出的问题是: 查询1:

SELECT a.name, count(*) 
FROM coauthor c INNER JOIN author a ON c.name = a.code
GROUP BY a.name

给予:

name Count(*)
KL 1
GB 2

查询 2:

SELECT a.name, count(*) 
FROM author a INNER JOIN book b ON a.code = b.author
GROUP BY a.name

给予:

name count(*)
GB 1
DC 1
RL 1

所以我想得到:

name count(*)
George B. 3
Donald C. 1
Roland L. 1
Kyle L. 1

我一直在网上搜索,但我想我不知道从哪里开始。

【问题讨论】:

  • 使用UNION ALL,有关如何使用它的说明,请参阅:google.com/search?q=union+all
  • 您的查询与表的列不匹配。请更正。

标签: sql group-by count left-join inner-join


【解决方案1】:

您可以将Author 加入到BookCoauthorLEFT 连接和聚合:

SELECT a.code, a.name, 
       COUNT(DISTINCT b.isbn) + COUNT(DISTINCT c.isbn) count
FROM Author a
LEFT JOIN Book b ON b.author = a.code
LEFT JOIN Coauthor c ON c.name = a.code
GROUP BY a.code, a.name;

请参阅demo

【讨论】:

    【解决方案2】:

    联合共同作者和书籍,然后将这些独特的结果加入作者

    SELECT q.code as Name
    -- , a.name as Author
    , COUNT(*) as Total
    FROM
    (
        SELECT name AS code, isbn
        FROM coauthor
        UNION
        SELECT author, isbn
        FROM book
    ) q
    JOIN author a
      ON q.code = a.code
    GROUP BY q.code, a.name
    ORDER BY q.code
    

    请注意,普通的UNION 会过滤掉重复的行。
    UNION ALL 保留重复的行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-23
      相关资源
      最近更新 更多