SQL-我需要使用where关键字,但它会抛出错误
我一直在网上练习SQL,我被困在这个问题上。我需要使用WHERE关键字,但如果我使用它,它不包括null值。当我不使用它时,它会因为行数不正确而抛出一个错误 这是我的密码:SQL-我需要使用where关键字,但它会抛出错误,sql,Sql,我一直在网上练习SQL,我被困在这个问题上。我需要使用WHERE关键字,但如果我使用它,它不包括null值。当我不使用它时,它会因为行数不正确而抛出一个错误 这是我的密码: SELECT categories.name, SUM(order_items.price) AS revenue FROM categories LEFT JOIN products ON categories.id = products.category_id JOIN order_items ON products.i
SELECT categories.name, SUM(order_items.price) AS revenue
FROM categories LEFT JOIN products
ON categories.id = products.category_id
JOIN order_items
ON products.id = order_items.product_id
JOIN orders
ON orders.id = order_items.order_id
WHERE orders.year between 2016 AND 2018
GROUP BY categories.name
ORDER BY revenue DESC;
问题是:
选择每个产品类别的名称及其在2016年至2018年期间产生的收入(该列收入的名称)。
按收入降序排列结果
以下是表格:
categories(id, name)
order_items(id, order_id, product_id, quantity, price)
orders(id, client_id, year, total_price)
products(id, name, category_id, price)
以下是输出应该是什么样子(有点像,我没有值为houseare的行,因为它的收入为NULL,不会显示):
编辑:
这是一个在线sql练习,所以代码是在线检查的,我不确定它使用的是什么服务器——只是语言是sql。
使用WHERE语句时出现的错误是行数错误
我刚取出WHERE子句时得到的错误是:
查询中的数据不正确或顺序错误
编辑2:由于第一条注释,我得到了所有的行,但是null仍然是表的第一行,它必须是最后一行,因为他们认为null是最低的,并且收入是按降序排列的
当我不使用它时,它会因为行数不正确而抛出一个错误
这是因为您将条件从WHERE
中丢弃,而不是将其移动到相应联接的ON
子句中:
SELECT categories.name, SUM(order_items.price) AS revenue
FROM categories
LEFT JOIN products
ON categories.id = products.category_id
LEFT JOIN order_items
ON products.id = order_items.product_id
LEFT JOIN orders
ON orders.id = order_items.order_id and orders.year between 2016 AND 2018
GROUP BY categories.name
ORDER BY CASE WHEN revenue IS NULL THEN 1 ELSE 0 END, revenue DESC;
这样,通过左连接获得的
NULL
s就不会受到干扰。请告诉我们a)您使用的是哪个数据库(例如MySQL、SQL Server),b)您得到的确切错误消息。实际上,我没有看到语法错误,尽管是的,也许您的逻辑与您想要的不符。@TimBiegeleisen Right,我没有意识到只有第一个连接是LEFT
,而其余的都是内部连接。非常感谢。非常感谢。这引起了所有的争吵!但是null仍然是表中的第一行,它必须是最后一行,因为他们认为null是最低的,并且收入是按降序排列的。另外,如果您能告诉我您如何决定使用WHERE或and,我将非常感激。它们看起来都很像我,我仍然很困惑为什么和在哪里工作。@iam这不是WHERE
和和之间的区别,而是WHERE
和上的(操作员和使其成为复合条件)。当您对来自中的联接表的字段应用条件时,其中
将联接与所有其他联接一起转换为内部联接,从而生成具有约束字段的联接。当在
上的内应用条件时,该条件仅适用于确定左联接本身,而不适用于整个结果集。
SELECT categories.name, SUM(order_items.price) AS revenue
FROM categories
LEFT JOIN products
ON categories.id = products.category_id
LEFT JOIN order_items
ON products.id = order_items.product_id
LEFT JOIN orders
ON orders.id = order_items.order_id and orders.year between 2016 AND 2018
GROUP BY categories.name
ORDER BY CASE WHEN revenue IS NULL THEN 1 ELSE 0 END, revenue DESC;