Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.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 按部分值分组_Sql_Sql Server_Join_Group By - Fatal编程技术网

Sql 按部分值分组

Sql 按部分值分组,sql,sql-server,join,group-by,Sql,Sql Server,Join,Group By,我对SQL非常陌生,我甚至不知道如何从这个开始。 我有两张桌子:仓库和物品。以下是它们的外观(简化): 仓库 ItemID | QuantityInStock | QuantityOnOrder | QuantityOnOrder2 | QuantityOnOrder3 | QuantityOnOrder4 -------+-----------------+-----------------+------------------+------------------+-------------

我对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
  • 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