我是SQL的新手,我不知道如何开始使用这个。 我有两张桌子:仓库和物品。这是他们的样子(简化):
仓库
ItemID | QuantityInStock | QuantityOnOrder | QuantityOnOrder2 | QuantityOnOrder3 | QuantityOnOrder4
-------+-----------------+-----------------+------------------+------------------+-----------------
1111 | 8 | 1 | 0 | 1 | 0
2222 | 3 | 0 | 0 | 0 | 0
3333 | 4 | 0 | 1 | 0 | 0
项
ItemID | Code
-------+-----------------
1111 | abc123456-111-01
2222 | abc123456-111-02
3333 | abc123457-112-01
我需要通过SQL查询返回的是:
ShortCode | Quantity
----------+---------
abc123456 | 9
abc123457 | 3
这可能是有史以来最糟糕的解释,所以我希望有人能够理解它。
请帮忙。
答案 0 :(得分:3)
假设您始终可以依赖匹配“代码”列的前9个字符,则以下查询应该有效。
/// note that the SUM method may return a negative (-) number
SELECT LEFT(I.[Code], 9) AS 'ShortCode', SUM([QuantityInStock] - [QuantityOnOrder] - [QuantityOnOrder2] - [QuantityOnOrder3] - [QuantityOnOrder4]) AS 'Quantity'
FROM [dbo].[Warehouse] AS W
INNER JOIN [dbo].[Items] AS I ON I.[ItemId] = W.[ItemId]
GROUP BY LEFT(I.[Code], 9)
答案 1 :(得分:2)
使用标准SQL:
SELECT
LEFT(Items.Code, 9) AS ShortCode,
SUM(T.remaining) AS Quantity
FROM Items
JOIN (
SELECT
ItemID,
QuantityInStock - QuantityOnOrder - QuantityOnOrder2 - QuantityOnOrder3 - QuantityOnOrder4 AS remaining
FROM Warehouse
) AS T ON (T.ItemID = Items.ItemID)
GROUP BY LEFT(Items.Code, 9);
未经测试,但应该有效。唯一可能的问题是您在表名和列名中使用大写字母,因此您可能必须将所有表名和列名括在反引号(`)或方括号中,具体取决于您的数据库服务器。
编辑:如果您想要过滤剩余数量少于一定数量的产品,只需添加:
HAVING SUM(T.remaining) > xxx
xxx
是您想要的最低数量