SQL计数列行依赖于group by时不同表中的列

时间:2015-12-12 04:04:45

标签: sql count oracle-sqldeveloper

我一直在尝试完成以下任务:

  

撰写一个查询,返回在多个类别中撰写书籍并且其图书由至少两个不同发布商发布的作者。显示作者的姓氏和名字,他们撰写的书籍标题和书籍类型。按作者的姓氏对输出进行排序。

这些是涉及的表格:

AUTHORS (Au_id, Au_lname, Au_fname, Phone, Address, City, State, Country, Postalcode) 
PUBLISHERS (Pub_id, Pub_name, City, State) 
TITLES (Title_id, Title, Type, Pub_id, Price, Advance, Total_sales, Notes, Pubdate, Contract) 
TITLEAUTHOR (Au_id, Title_id) 

我能够识别我需要的列,但不确定如何实现过滤器(2个不同的作者,2种不同的类型)。我假设我需要按作者ID分组并计算Pub_id和Type列。

这是我到目前为止所写的:

SELECT AUTHORS.Au_lname, AUTHORS.Au_fname, TITLE.Title_id, TITLE.Type
from AUTHORS
JOIN TITLEAUTHOR ON AUTHORS.Au_id = TITLEAUTHOR.Au_id
JOIN TITLE ON TITLEAUTHOR.Title_i = TITLE.Title_i 
group by AUTHORS.Au_lname, AUTHORS.Au_fname, TITLE.Title_id, TITLE.Type
ORDER BY AUTHORS.Au_lname;

1 个答案:

答案 0 :(得分:1)

欢迎来到Stack Overflow,Tomasz!祝贺你的第一篇文章。你已经做了几件很棒的事情:

  • 您包含了有关架构的详细信息
  • 您提供了明确的问题陈述
  • 您添加了一个已经尝试过的SQL示例。

有几种方法可以改善您的帖子,这有助于您获得良好答案的机会,同时提高您参与社区的能力:

  • 格式化时非常小心 - 第二次编辑引入了一些冗余文本。
  • 特别对你的代码 - 你给的第一个集合有一些不正确的列名,这可能会导致一些用户查看你的帖子然后忽略它。在您首次发布显示在列表顶部附近的问题之后,有一个关键窗口;这是获得答案的最好机会,因此对您的演示文稿要非常小心。 Here's a link对如何提问进行了一些很好的阅读。
  • 当你正在完成任务时,要提前做好准备!可以想象,这个社区在家庭作业方面得到了很多帮助。许多普通用户对那些希望“欺骗”的人感到沮丧。通过在线发布作业来完成作业。但是有很多方法可以获得帮助:请仔细阅读this post,以便为下一个问题做好准备。关键是要表明你已经尝试过自己解决它,具体说明什么不起作用,并明确这是家庭作业的事实。

现在,关于你的问题!您正在寻找的是HAVING子句,它允许您过滤查询以仅返回满足聚合级别条件的组的成员。你对COUNT的直觉是正确的,HAVING子句会让你这样做。这是一个例子:

SELECT Au_id
FROM 
    AUTHORS 
     INNER JOIN 
    TITLEAUTHOR ON 
        AUTHORS.Au_id = TITLEAUTHOR.Au_id 
     INNER JOIN 
    TITLES ON 
        TITLEAUTHOR.Title_id = TITLE.Title_id
GROUP BY Au_id 
HAVING 
    COUNT(DISTINCT TITLES.pub_id) > 1 AND 
    COUNT(DISTINCT TITLES.Type) > 1

请注意,这会在DISTINCT功能中添加单词COUNT() - 这有助于您与两个不同的发布商会面#34;需求。

一旦你理解了如何使用HAVING,那么你可以编写一个查询来获取你的作业要求的列,并过滤该集合只返回你想要的作者:基本的查询结构看起来像这样:

SELECT MyColumns
FROM MyTables 
WHERE Au_id IN 
  (
    SELECT Au_id
    FROM 
        AUTHORS 
         INNER JOIN 
        TITLEAUTHOR ON 
            AUTHORS.Au_id = TITLEAUTHOR.Au_id 
         INNER JOIN 
        TITLES ON 
            TITLEAUTHOR.Title_id = TITLE.Title_id
    GROUP BY Au_id 
    HAVING 
        COUNT(DISTINCT TITLES.pub_id) > 1 AND 
        COUNT(DISTINCT TITLES.Type) > 1
  )
ORDER BY WhateverYouWant
祝你好运,欢迎来到SQL!