Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-我需要使用where关键字,但它会抛出错误_Sql - Fatal编程技术网

SQL-我需要使用where关键字,但它会抛出错误

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

我一直在网上练习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.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;