【问题标题】:Selecting items without duplicates in SQL, DISTINCT helping but not fully working在 SQL 中选择没有重复项的项目,DISTINCT 有帮助但不能完全正常工作
【发布时间】:2018-10-28 16:45:20
【问题描述】:

我有一个 SQL 请求问题,我必须“为已出版 3 本书或更多书籍的出版商列出出版商的名称和出版的书籍数量”。 book 表有出版商名称 [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 添加到发布者的选择后,它返回了 72 个发布者,但是这仍然包含许多具有不同数量值的重复,我不明白为什么要这样做。抱歉,如果这是一个重复的问题,但是我读过的许多问题都更加基础,而且我是 SQL 新手。任何帮助表示赞赏,谢谢。

【问题讨论】:

  • orderDetail 表与此有什么关系?那是关于买了多少书——没有出版。
  • 更新您的问题添加适当的数据样本..您的实际结果和预期结果
  • Bad habits to kick : using old-style JOINs - 旧式 逗号分隔的表格列表 样式已替换为 ANSI 中的 proper ANSI JOIN 语法-92 SQL 标准(25 多年前),不鼓励使用它
  • @PatrickArtner 是的,你是对的,回想起来我不知道我要去哪里
  • @marc_s 谢谢,非常正确。这是我们的讲师教我们的方式,她告诉我们这样做。自从我去年发布这个问题以来,我已经与雇主交谈过,他们说我正在就读的大学的课程已经过时了,而且在很多方面仍然生活在过去,我今年真的看到了哈哈

标签: sql distinct


【解决方案1】:

正如我所说:购买与此无关。您查看的是一个出版商出版了多少本书,而不是他卖出了多少。

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

【讨论】:

    【解决方案2】:

    如果您知道如何阅读,该问题几乎已经用 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
    

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-29
        • 1970-01-01
        • 1970-01-01
        • 2013-10-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多