【问题标题】:Not confident in SUM and not sure how to limit a field对 SUM 没有信心,不确定如何限制字段
【发布时间】:2019-05-05 20:53:31
【问题描述】:

尝试为作业问题编写 SELECT 语句。我添加了一个 SUM 函数,但不确定它是否可以这样使用。由于表彼此相距较远,因此具有 3 个 JOIN。老实说,如果我当前的任何代码不正确,请告诉我。但我主要关注的是如何限制表格中“停产”的字段。

问题是:从销售数据模型中提取一份声明,显示客户名字、客户电子邮件地址、产品名称和总单位数,其中总单位数是库存单位和订购单位的总和。将记录限制为未停产的订单(即已停产字段中的“N”)。为 SELECT 子句中的每个字段创建一个别名,包括计算列的“总单位”。为 FROM 子句中的每个表创建并使用别名。按总单位排序。

表:https://imgur.com/rdZthcH

SELECT customerFN AS “First Name”, customerEmail AS “Email”, productName AS “Product Name”,
(SUM(unitsInStock)+SUM(unitsonorder)) AS "Total Units"
FROM customer c
JOIN order o
ON c.customerID = o.customerID
JOIN orderLine l
ON o.orderID = l.orderID
JOIN product p
ON l.productCode = p.productCode
WHERE 

WHERE 子句后面什么都没有,因为代码不完整。代码不完整,因为我认为我需要某种 WHERE 子句来限制“停止”字段。我只是不知道该怎么做。我查了 Where 子句,我认为它会使用 >

【问题讨论】:

  • 至少你喜欢的“和”引号不是像“这样的正确双引号,并且可能会产生语法错误......WHERE之后什么都没有。
  • 我会改变的,谢谢。但是在 WHERE 之后什么都没有,因为那是我的问题所在。我根本不知道如何限制停产的领域。我只是假设你会使用 WHERE 子句。

标签: sql oracle


【解决方案1】:

在我看来,您需要将 DISCONTINUED = 'N' 添加到您的 WHERE 子句中,或者换句话说

SELECT c.customerFN AS "First Name",
       c.customerEmail AS "Email",
       p.productName AS "Product Name",
       SUM(p.unitsInStock) + SUM(p.unitsonorder) AS "Total Units"
  FROM customer c
  JOIN order o
    ON c.customerID = o.customerID
  JOIN orderLine l
    ON o.orderID = l.orderID
  JOIN product p
    ON l.productCode = p.productCode
  WHERE p.DISCONTINUED = 'N'
  ORDER BY SUM(p.unitsInStock) + SUM(p.unitsonorder)

此外,您似乎正在使用某种文字处理器来创建代码,因为您的原始代码具有花哨的开引号和右引号字符(即“和”),而不是 ASCII 引号字符(即" )。我的大多数(任何?)编程语言或开发工具都不会接受那些文字处理器生成的字符。例如,看看你原来的问题——注意“名字”和“电子邮件”是如何没有突出显示为问题中的字符串,但“总单位”是?那是因为只有最后一个被双引号字符包围。我建议你坚持使用普通的 ASCII 编辑器,如 Windows 上的记事本,或任何数以千计的编程编辑器工具,你会更开心。

祝你好运。

【讨论】:

    【解决方案2】:

    调试此查询时,您很可能会遇到多个(不同的)错误消息。另外:在没有表/数据的情况下编写查询可能有点棘手,因为某些方面很容易被忽略。因此,我们将使用一些测试表(包括数据),请参阅dbfiddle here。 下面的查询代码将向您显示您可能会看到的各种错误 - 以及修复它们所需的 SQL。阅读代码中所有的cmets。

    关系模型(缩短 id 列名)

    ORA-00903:无效的表名

    在您的原始查询中,您使用了一个名为 ORDER 的表。 ORDER 是保留字,请参阅documentation。命名表时避免使用它。

    ORA-00937:不是单组函数

    当使用有效的表名时,我们可以执行查询。在 WHERE 子句中添加一个条件(见下文)。由于 SELECT 和 ORDER BY 子句中的 SUM(),我们收到错误消息。显然,我们需要在查询中添加一个 GROUP BY 子句(这会立即导致下一条错误消息...)

    SELECT 
      c.fn AS "First Name",
      c.email AS "Email",
      p.productName AS "Product Name",
      SUM(p.unitsInStock) + SUM(p.unitsonorder) AS "Total Units" --<- ORA-00937 
    FROM customer c
      JOIN orders o     ON c.id = o.id -- table name fixed
      JOIN orderLine l  ON o.id = l.orderid
      JOIN product p    ON l.productCode = p.code
    WHERE p.DISCONTINUED = 'N' --<- condition
    ORDER BY SUM(p.unitsInStock) + SUM(p.unitsonorder) --<- ORA-00937
    ;
    
    -- ORA-00937: not a single-group group function
    --
    -- Cause: A SELECT list cannot include both a group function, 
    -- such as AVG, COUNT, MAX, MIN, SUM, STDDEV, or VARIANCE, 
    -- and an individual column expression, 
    -- unless the individual column expression is included in a GROUP BY clause.
    -- see:
    -- https://docs.oracle.com/cd/B10501_01/server.920/a96525/e900.htm
    

    ORA-00979:不是 GROUP BY 表达式

    SELECT 
      c.fn AS "First Name",
      c.email AS "Email",
      p.productName AS "Product Name",
      SUM(p.unitsInStock) + SUM(p.unitsonorder) AS "Total Units"
    FROM customer c
      JOIN orders o     ON c.id = o.id
      JOIN orderLine l  ON o.id = l.orderid
      JOIN product p    ON l.productCode = p.code
    WHERE p.DISCONTINUED = 'N'
    group by p.productname  --<- causes ORA-00979
    ORDER BY SUM(p.unitsInStock) + SUM(p.unitsonorder)
    ;
    -- ORA-00979: not a GROUP BY expression
    --
    -- Make sure that columns ( listed in the SELECT clause ) that are _not_ "aggregated"
    -- are listed in the GROUP BY clause, otherwise you may get an ORA-00937. 
    

    查询有效 - 未选择任何行!

    SELECT 
      c.fn AS "First Name",
      c.email AS "Email",
      p.productName AS "Product Name",
      SUM(p.unitsInStock) + SUM(p.unitsonorder) AS "Total Units"
    FROM customer c
      JOIN orders o     ON c.id = o.id
      JOIN orderLine l  ON o.id = l.orderid
      JOIN product p    ON l.productCode = p.code
    WHERE p.DISCONTINUED = 'N'
    group by p.productname, c.fn, c.email
    ORDER BY SUM(p.unitsInStock) + SUM(p.unitsonorder)
    ;
    
    -- result
    no rows selected
    

    收尾工作

    SELECT 
      c.fn AS "First Name",
      c.email AS "Email",
      p.productName AS "Product Name",
      SUM(p.unitsInStock) + SUM(p.unitsonorder) AS "Total Units"
    FROM customer C
      JOIN orders O     ON C.id = O.customerid  --<- JOIN condition amended
      JOIN orderLine L  ON O.id = L.orderid
      JOIN product P    ON L.productCode = P.code
    WHERE p.DISCONTINUED = 'N'
    group by p.productname, c.fn, c.email
    ORDER BY "Total Units" --<- you can use the column alias here - instead of SUM(...)
    fetch first 10 rows only -- optional
    ;
    
    -- result
    First Name  Email                        Product Name  Total Units  
    Annnora     agrime3@hc360.com            Beans         117          
    Arleen      adahlback5@sciencedaily.com  Beans         117          
    Gwendolin   gwalder0@unblog.fr           Beans         117          
    Tomkin      tdeignan2@eepurl.com         Beans         117          
    Alard       aaimeric9@cyberchimps.com    Beans         117          
    Jeremiah    jolland4@dagondesign.com     Beans         117          
    Melita      meason8@cnbc.com             Beans         117          
    Stanwood    slanphere6@walmart.com       Beans         117          
    Bobbi       bfireman1@bbb.org            Beans         117          
    Idelle      ililly7@pen.io               Beans         117          
    
    
    10 rows selected. 
    

    请注意,您无需事先在表中插入任何行即可构建查询(请参阅dbfiddle)。您可能需要调整逻辑(等),以便查询完全满足要求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-04
      • 1970-01-01
      • 2023-01-21
      • 1970-01-01
      • 1970-01-01
      • 2017-04-16
      • 1970-01-01
      相关资源
      最近更新 更多