按部分值分组

时间:2011-07-28 11:54:28

标签: sql sql-server join group-by

我是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是加入两个表的关键
  • Items表中的代码包括主要产品代码(abc123456)和变体(-111-01)。我需要按主要产品代码对行进行分组
  • 我需要的数量来自仓库表,它等于“QuantityInStock - QuantityOnOrder - QuantityOnOrder2 - QuantityOnOrder3 - QuantityOnOrder4”。使用这个我们得到abc123456(在项目表中有ItemId 1111和2222的两个变体)和数量等于8减去1减去0减去1减去0对于1111,并且3减去0减去0减去0减去0对于2222这一起给出9

这可能是有史以来最糟糕的解释,所以我希望有人能够理解它。

请帮忙。

2 个答案:

答案 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是您想要的最低数量