2012-02-22 89 views
0

A)当商品出售,一个表将记录在列TYPE在列ID &一个“N”的“O”: -如何使用MAX与其他标准

SKU  ID TYPE NR 
------------------------- 
HAB1122 O N  201211 

B)当产品是返回,表将记录在列TYPE在列ID &一个“R”一个“O”: -

SKU  ID TYPE NR 
------------------------- 
HAB1122 O R  201223 

方案1

商品售出&后来返回。它随后被出售: -

SKU  ID TYPE NR 
------------------------- 
HAB1122 O N  201211 
HAB1122 O R  201223 
HAB1122 O N  201245 
HAB2233 O N  201263 
HAB3344 O N  201303 
HAB3344 O R  201341 

使用SQL: -

Select SKU, max(NR) 
from tableA 
where SKU like ‘HAB%’ and ID = ‘O’ 
group by SKU 

结果: -

SKU  NR 
---------------- 
HAB1122 201245 
HAB2233 201263 
HAB3344 201341 

这是正确的结果,因为我想追查的最后NR无论货物是出售还是退回,都可以卖出。

如果我想跟踪与状态货物只卖出了下来,最后NR,预期的结果应该是: - 作为货物被退回&没有随后被卖不考虑

SKU  NR 
--------------- 
HAB1122 201245 
HAB2233 201263 

HAB3344。

我该如何更改SQL?

回答

2

试试这个:

select SKU, max(NR) 
from  TABLEA T1 
where SKU like 'HAB%' and ID = 'O' 
group by SKU 
having max(NR) <> (select nvl(max(NR), 0) 
        from TABLEA T2 
        where T1.SKU = T2.SKU and T2.type = 'R'); 

这是使用Oracle。您没有注明您的系统,因此having可能不适用于您的系统,但具有同等意愿。

+0

我正在使用DB2。它提示一个错误: - 未找到* LIBL类型* N中的NVL。 – Bob 2012-02-22 05:59:14

+0

我相信你在DB2中使用'coalesce'而不是'nvl'。放手吧。 – 2012-02-22 06:03:28

+0

我修改并执行了SQL语句。处理数据的时间太长了。事实上,它仍在运行。在此之前,生成结果需要不到2分钟的时间。 – Bob 2012-02-22 06:27:55

0

Select SKU, max(NR) from tableA where SKU like 'HAB%' and ID = 'O' and TYPE = 'N' group by SKU

+0

不,它会提取HAB1122(201245),HAB2233(201263)和HAB3344(201303)。由于货物仍在库存中,HAB3344不在那里。我只需要跟踪已售出的物品,即不再在库存中。 – Bob 2012-02-22 05:30:29

+0

编辑(格式化)问题使得查看更容易。约翰多伊尔的答案似乎是对的;并尝试下次更好地设置你的问题。 – penartur 2012-02-22 05:53:47

1
SELECT * 
FROM tableA AS T1 
WHERE SKU like ‘HAB%’ and ID = ‘O’ AND T1.[TYPE] = 'N' 
AND NOT EXISTS (
    SELECT * 
    FROM tableA AS T2 
    WHERE T2.SKU = T1.SKU 
    AND T2.NR > T1.NR 
    AND ID = ‘O’ 
) 

结果:

SKU  ID TYPE NR 
---------- ---- ---- ----------- 
HAB1122 O N 201245 
HAB2233 O N 201263 

从快速谷歌搜索,DB2似乎支持窗口功能和CTE的。我可以说,至少在SQL Server中,窗口函数执行在这种情况下更好:

ROW_NUMBER()http://forums.devshed.com/db2-development-114/rownumber-over-169453.html

CTE的:http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/ad/samples/clp/s-cte-db2.htm

窗口功能的方法:

WITH T AS (
    SELECT T1.*, 
      ROW_NUMBER() OVER(PARTITION BY SKU ORDER BY NR DESC) AS RN 
    FROM tableA AS T1 
    WHERE ID = ‘O’ 
) 
SELECT T.SKU, T.NR 
FROM T 
WHERE RN = 1 AND SKU like ‘HAB%’ AND T1.[TYPE] = 'N'; 
+0

我试过第一个选项。处理数据的时间太长了。事实上,它仍在运行。在此之前,生成结果需要不到2分钟的时间。使用选项2,我收到以下错误消息: - 错误:SQL5001 - 列限定符或表T1未定义。 (状态:S1000,本机代码:FFFFEC77) – Bob 2012-02-22 06:44:35

+0

@Bob - 对于你的错误 - 使用'tableA'而不是'@ myTable'(我认为)。我会更新我的答案来匹配你的表格。 – 2012-02-22 06:48:57

+0

您的'ROW_NUMBER()'解决方案可能无法按预期工作。如果除了'O''之外的某个ID恰好具有每个“SKU”的最大“NR”值,那么您的查询将不会返回该“SKU”,因为这两个“O”行都不会被排列为“1” ,而OP的意图似乎是忽视其他(非'O')ID可能会在'O'之后出现的事实。 – 2012-02-22 06:51:16

0

如果你的数据库系统支持排名功能,如ROW_NUMBER(),您可以尝试以下操作:

WITH ranked AS (
    SELECT 
    *, 
    ROW_NUMBER() OVER (PARTITION BY SKU ORDER BY NR DESC) AS RNK 
    FROM atable 
    WHERE SKU LIKE 'HAB%' 
    AND ID = 'O' 
) 
SELECT 
    SKU, 
    NR 
FROM ranked 
WHERE TYPE = 'N' 
    AND RNK = 1 
+0

错误:SQL0104 - 令牌,无效。有效令牌:FROM INTO。 (状态:37000,本机代码:FFFFFF98) – Bob 2012-02-22 06:48:21

+0

@Bob:我认为您评论中的标记本身是由解析器“吃掉”的。请尝试重新发布包含反引号的消息('\'')。或者告诉我它是什么标记。 – 2012-02-22 07:20:23

+0

令牌“,”无效。有效令牌:FROM INTO。 (状态:37000,本机代码:FFFFFF98) – Bob 2012-02-22 07:31:36