我有两个表:Inventory和InventoryTypes。Inventory有一列表示可用项目的数量,还有一列表示外键类型ID(此处不需要其他类型(。InventoryTypes有一列用于class(即库存类型的进一步分类(、typeName、description和typeID主键。
我想对按typeID分组的可用列求和,然后在typeID相等的InventoryTypes表中加入
我设法创建了最初的SQL语句,它起作用:
SELECT typeID, SUM(available) AS NumberofInventoryPerType FROM Inventory GROUP BY typeID;
当我尝试对InventoryTypes表使用LEFT JOIN时,如下所示:
SELECT typeID, SUM(available) AS NumberofInventoryPerType FROM Inventory GROUP BY typeID
LEFT JOIN (InventoryTypes ON Inventory.typeID = InventoryTypes.typeID ORDER BY InventoryTypes.descr);
样本数据:
库存表:
发票ID-可用-类型ID
1-10-1
2-15-2
3-10-1
InventoryTypes表:
typeID-class-typeName-descr
1-包装-盒-10x10盒
2-工具-移液管-0.1ml移液管
然后查询应该返回:
typeID-class-typeName-descr-InventoryPerType编号
1-包装-盒子-10x10盒子-20
2-工具-移液管-0.1ml移液管-15
查询未执行,并指示LEFT JOIN附近有错误。我只找到了初始选择查询没有GROUP BY子句的示例。这就是我的错误所在吗?感谢提供的任何帮助
SQL查询的一般结构是(注意,除了SELECT之外,所有部分都是可选的(:
SELECT columns
FROM block_of_data_like_a_table_or_query
JOIN another_block_of_data_like_a_table_or_query
JOIN a_third_block_of_data_like_a_table_or_query
WHERE conditions
GROUP BY columns
ORDER BY columns
你不能把你的[左]加入放在一个群组之后;你必须把它放在FROM区域
如果您想执行分组,然后将其加入其他表,则可以将其分组为子查询:
SELECT columns
FROM table
JOIN (SELECT columns FROM table JOIN table WHERE conditions GROUP BY columns) ON ...
WHERE conditions
GROUP BY columns
ORDER BY columns
因此,SQL必须如何结构化的总体规则得以保留;表是数据块,查询也是(产生(数据块。数据块必须连接到FROM区域中。
在您的特定情况下,将分组作为子查询,然后加入结果:
SELECT *
FROM
(SELECT typeID, SUM(available) AS NumberofInventoryPerType FROM Inventory GROUP BY typeID) sumup
LEFT JOIN
InventoryTypes it
ON sumup.typeID = it.typeID
ORDER BY it.descr
我认为您不应该将Group By与LEFT JOIN混合:
以下是LEFT JOIN的示例:
SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID
ORDER BY Customers.CustomerName;
尝试将结果分组到一个额外的查询中。使用INTO Param保存第一个查询的结果!
另请参见此处
形式化地(甚至没有试图理解查询的含义(
SELECT Inventory.typeID, SUM(Inventory.available) AS NumberofInventoryPerType
FROM Inventory
LEFT JOIN InventoryTypes ON Inventory.typeID = InventoryTypes.typeID
GROUP BY Inventory.typeID
ORDER BY ANY_VALUE(InventoryTypes.descr);
我建议:
SELECT it.typeID, SUM(i.available) AS NumberofInventoryPerType
FROM InventoryTypes it LEFT JOIN
Inventory i
ON it.typeID = i.typeID
ORDER BY MAX(it.descr);
注:
- 如果您想要所有库存类型,它应该是
LEFT JOIN
中的第一个表 - 使用表别名使查询更易于编写和读取