2016-04-29 36 views
0

虽然给出了发布者名称,但我想生成按年份和月份排序的书籍报告。对于每一个年份和月份的报告应该表明BOOKID,标题,订单标题,总数量和总销售价值(包括订单价值和零售价)的总数量,同时考虑到书IDSQL SELECT多个项目错误

我的代码:

SELECT 
    ShopOrder.OrderDate, Book.BookID, Book.title, 
    COUNT(ShopOrder.ShopOrderID) AS "Total number of order", 
    SUM (Orderline.Quantity) AS "Total quantity", 
    Orderline.UnitSellingPrice * Orderline.Quantity AS "Total order value", 
    Book.Price * OrderLine.Quantity AS "Total retail value" 
FROM 
    ShopOrder, Publisher, Book, Orderline 
WHERE 
    Publisher.name = 'Penguin Books' 
    AND ShopOrder.ShopOrderID = Orderline.ShopOrderID 
    AND Book.BookID = Orderline.BookID 
    AND Publisher.PublisherID = Book.PublisherID 
ORDER BY 
    ShopOrder.OrderDate; 

错误:

column "shoporder.orderdate" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: SELECT ShopOrder.OrderDate, Book.BookID, Book.title, COUNT(S... ^

ERROR: column "shoporder.orderdate" must appear in the GROUP BY clause or be used in an aggregate function
SQL state: 42803
Character: 8

+0

您确定有一个表或视图叫做orderline吗? – n8wrl

+0

http://stackoverflow.com/questions/695289/cannot-simply-use-postgresql-table-name-relation-does-not-exist - 你没有正确引用表名。此外,你可以别名你的表名,所以你不必一遍又一遍地写下来(我知道这不是问题的一部分,但它会缩短你的查询并使其更容易阅读)。 – Dresden

+0

编辑错误,对以前的错误感到抱歉 –

回答

0

感谢您的状态报告。你有问题吗?

一旦您解决了标识符问题,您的查询将遇到有关SELECT列表中不属于GROUP BY子句的非聚合的错误。

现在是2016年。在过去的时间里,抛弃旧式逗号操作符进行连接操作,并使用JOIN关键字将连接谓词移动到适当的ON子句中。

最可能的原因这个错误(这是只有猜测)是创建“订单行”表时,表的名字被双引号括起来,并有至少一个上部表名中的大写字母。现在表名是区分大小写,对表的引用必须用双引号括起来,并且表的名称必须完全匹配,包括大小写。


编辑由于更新问题

在您添加聚合函数查询,我建议您验证查询返回你所期望的行。

SELECT s.OrderDate 
    , b.BookID 
    , b.title 
    , s.ShopOrderID 
    , o.Quantity 
    , o.UnitSellingPrice * o.Quantity AS "Total order value" 
    , b.Price * o.Quantity    AS "Total retail value" 
    FROM ShopOrder s 
    JOIN Orderline o 
    ON o.ShopOrderID = s.ShopOrderID 
    JOIN Book 
    ON b.BookID = o.BookID 
    JOIN Publisher p 
    ON p.PublisherID = b.PublisherID 
WHERE p.name = 'Penguin Books' 
ORDER 
    BY s.OrderDate 
    , s.ShopOrderID 
    , b.BookID 
    , o.Quantity 

然后,你可以在添加聚合函数。 SELECT列表中不是聚合的任何表达式(MAX(),MIN(),SUM(),COUNT())必须出现在GROUP BY子句中。

SELECT b.BookID 
    , b.title 
    , SUM(o.UnitSellingPrice * o.Quantity) AS "Total order value" 
    , SUM(b.Price * o.Quantity)    AS "Total retail value" 
    FROM ShopOrder s 
    JOIN Orderline o 
    ON o.ShopOrderID = s.ShopOrderID 
    JOIN Book 
    ON b.BookID = o.BookID 
    JOIN Publisher p 
    ON p.PublisherID = b.PublisherID 
WHERE p.name = 'Penguin Books' 
GROUP 
    BY b.BookID 
    , b.title 
ORDER 
    BY b.BookID 
    , b.title 
+0

新错误上面我的问题编辑错误,我从字面上不知道如何解决它。 –

+0

非常感谢你,现在我明白了SQL的工作原理了! –

+0

你只能看到冰山一角,蚱蜢。 – spencer7593

0

检查是否有名为订单项目表。 要检查它执行以下查询

select * from orderline; 

最有可能的是,你没有这样的表。

+0

编辑错误的问题,对我的错误感到抱歉 –