2011-07-28 110 views
1

我对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的Items表中有两个变体),并且Quantity对于1111是等于8减1减去0减1减0,对于2222是3减0减0减0,它们一起给出9

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

请帮忙。

+0

最小量为主要产品的代码始终在相同的模式,你可以始终保证你只需要匹配前9个左边的字符? – Kane

+0

是的。我很抱歉,我应该提到这一点。它将始终是9个字符。我猜你在想LEFT(Code,9)? – Max

回答

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是你想要

+0

并且在您的代码中,它“剩余”我需要筛选出 – Max

+0

否,'Quantity',它是该ShortCode所有剩余计数的总和。如果过滤“剩余”,那么您将删除单个项目,但不会删除共享同一ShortCode的组。 –

+0

好,我现在明白了。但是HAVING Quantity> xxx给了我这个错误:关键字'GROUP'附近的语法错误。 – Max

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) 
+0

我正在使用MSSSQL。代码工作正常,谢谢 – Max

+0

但还有一件事 - 如何计算QuantityInStock减去所有QuantityOn Order列到代码中? – Max

+0

没有probs,但我不知道如何计算数量字段,所以@ Jonhoo的答案可能更符合您的需要。 – Kane