Sql 按部分值分组
我对SQL非常陌生,我甚至不知道如何从这个开始。 我有两张桌子:仓库和物品。以下是它们的外观(简化): 仓库Sql 按部分值分组,sql,sql-server,join,group-by,Sql,Sql Server,Join,Group By,我对SQL非常陌生,我甚至不知道如何从这个开始。 我有两张桌子:仓库和物品。以下是它们的外观(简化): 仓库 ItemID | QuantityInStock | QuantityOnOrder | QuantityOnOrder2 | QuantityOnOrder3 | QuantityOnOrder4 -------+-----------------+-----------------+------------------+------------------+-------------
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
- ItemID是联接两个表的键
- 项目表中的代码包括主要产品代码(abc123456)和变型(-111-01)。我只需要按主要产品代码对行进行分组
- 我需要的数量来自仓库表,它等于“QuantityInStock-QuantityOnOrder-QuantityOnOrder2-QuantityOnOrder3-QuantityOnOrder4”。使用这个,我们得到abc123456(在Items表中有两个变量,ItemId为1111和2222),数量等于8减1减0减1减0,1111等于3减0减0减0,2222等于9
请提供帮助。假设您可以始终指望匹配代码列的前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)
假设您总是可以指望匹配代码列的前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)
使用标准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
是使用标准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
是您想要的最小数量主产品代码是否始终采用相同的模式,并且您能否始终保证您只需要匹配左前9个字符?是的。我很抱歉,我应该提到这一点。它将始终是9个字符。我猜你会想到左(代码,9)?主产品代码是否总是以相同的模式,并且你是否总能保证只需要匹配左前9个字符?是的。我很抱歉,我应该提到这一点。它将始终是9个字符。我猜你会想到左边(代码,9)?还有一件事-我如何将QuantityInStock减去所有QuantityOn Order列的计算结果输入到代码中?没有问题,但我不确定如何计算数量字段,因此@Jonhoo的答案可能更符合您的需要。我如何使用“数量”筛选出少于指定数量的记录?更新了我的答案,还包括如何限制的说明。不过,还有一件事-我如何计算QuantityInStock减去所有QuantityOn订单列后输入代码?没有问题,但我不确定如何计算数量字段,因此@Jonhoo的答案可能更符合您的需要。我如何使用“数量”筛选出数量少于指定数量的记录?更新了我的答案,还包括如何限制数量的说明。否,数量
,这是该短代码的所有剩余计数的总和。如果您对剩余的进行筛选,则您将删除单个项目,但不会删除共享同一短代码的组。好的,我现在明白了。但是,HAVING Quantity>xxx给了我这个错误:关键字“GROUP”附近的语法不正确。您是否将HAVING Quantity>xxx
添加到groupby之后,但在末尾的分号之前?groupby LEFT(Items.code,9)HAVING Quantity>5;用法:具有总和(T.剩余)>5
否,数量
,它是该短代码的所有剩余计数的总和。如果您对剩余的进行筛选,则您将删除单个项目,但不会删除共享同一短代码的组。好的,我现在明白了。但是,HAVING Quantity>xxx给了我这个错误:关键字“GROUP”附近的语法不正确。您是否将HAVING Quantity>xxx
添加到groupby之后,但在末尾的分号之前?groupby LEFT(Items.code,9)HAVING Quantity>5;用法:具有总和(T.剩余)>5