选择 SQL 中没有重复项的项目,DISTINCT 有帮助但没有完全发挥作用

Selecting items without duplicates in SQL, DISTINCT helping but not fully working

我有一个 SQL 请求问题,我必须 "list the names of the publishers, and the number of books published, for publishers who have published 3 or more books"。图书 table 有出版商名称 [book (isbn, title, authorID, genre, pubYear, publisher, rrPrice, avgRating)] 并且 orderDetails 有数量 [orderDetails (oNo, bookISBN, quantity)].

我最初尝试过这个 SQL 语句:

SELECT publisher, quantity
FROM book, orderDetails
WHERE ISBN IN (SELECT bookISBN 
               FROM orderDetails
               WHERE quantity > 3); 

它返回了 425 行,在将 DISTINCT 添加到发布者的 select 之后它返回了 72 个发布者,但是这仍然包含许多具有不同数量值的重复项,我不明白这是为什么这样做。如果这是一个重复的问题,我深表歉意,但是我读过的许多问题都更加基础,而且我是 SQL 的新手。感谢任何帮助,谢谢。

订单详情table与您提出的查询无关,因为问题不是订购的数量。例如,带有 isbn xyz 的书可能有超过 1 本书由同一作者出版,但这并不意味着作者在这种情况下出版了不止一本书。它是每位作者出版了多少本书,而不是订购了多少本书(每位作者出版) 刚刚

Select 
     publisher
    ,count(*) 
from book 
group by publisher 
having count(*) >= 3;

正如我评论的那样:购买与此无关。您寻找的是出版商出版了多少本书 - 而不是他卖出了多少本书。

CREATE TABLE book
    ([isbn] varchar(10), [title] varchar(10), [authorID] int, [genre] varchar(7), 
     [pubYear] int, [publisher] varchar(11), [rrPrice] int, [avgRating] int)
;

INSERT INTO book
    ([isbn], [title], [authorID], [genre], [pubYear], [publisher], [rrPrice], [avgRating])
VALUES
    ('''a12345''', '''tata''', 1, '''ups''', 1998, '''tutut''', 23.4, 7.3),
    ('''a12345''', '''tata 2''', 1, '''ups''', 1999, '''tutut''', 23.4, 7.3),
    ('''a12345''', '''tata 3''', 1, '''ups''', 2000, '''tutut''', 23.4, 7.3),
    ('''a12345''', '''tata 4''', 1, '''ups''', 2001, '''tutut''', 23.4, 7.3),
    ('''a12345''', '''tata 5''', 1, '''ups''', 2002, '''tutut''', 23.4, 7.3),
    ('''a12345''', '''tata 6''', 1, '''ups''', 2003, '''tutut''', 23.4, 7.3),
    ('''a12345''', '''LK 6''', 2, '''ups''', 2003, '''lltutut''', 23.4, 7.3),
    ('''a12345''', '''LK 8''', 2, '''ups''', 2003, '''lltutut''', 23.4, 7.3)

SELECT publisher, count() 
from book   
group by publisher  
having count()>2 

你应该得到

publisher    count()
'tutut'      6

测试:https://www.db-fiddle.com/f/vhRaL8BsuAa4juEnGjekez/0

问题几乎已经写在SQL,如果你知道如何阅读它。

select publisher,    -- list the names of the publishers,
       count(*)      -- and the number of books published,
from   book
group by publisher
having count(*) >= 3 -- who have published 3 or more books

您缺少的 "trick" 是 having:它适用于 countsum 等聚合函数的结果。相比之下,where 在聚合之前过滤行。