3

这是我第一次在这里提问,所以请告诉我是否可以提供更多数据来帮助您帮助我:)


目前,我有一个类似于以下内容的表:
ID ITEM ADJUST_QTY ADJUST_TYPE INV_SOURCE&n bsp; INV_DEST WAREHOUSE VENDORASN
1 A12 100 A NULL ALLOC 1001 NULL
2 A12 50 S NULL ALLOC 1001 NULL
3 A12 100 S NULL UN-ALLOC 1001 12345
4 A12 50 A NULL UN-ALLOC 1001 12345
5 B12 102 A NULL ALLOC UN-ALL
6 B12 100 A UN-ALLOC ALLOC 1002 NULL

我的查询的输出应该是:
ITEM ADJUST_QTY INV_SOURCE INV_DEST WAREHOUSE VENDORASN
A12 50 NULL ALLOC 1001 NULL(这是 ID 1 - ID 2)
A12 -50 NULL UN-ALLOC 1001 12345(这是 ID 4 - ID 3)
B12 100 ALLOC UN-ALLOC 1002 NULL(这是 ID 5)
B12 100 UN-ALLOC ALLOC 1002 NULL(这是 ID 6)

ADJUST_TYPE A = 加,S = 减。我试图找到项目、INV_SOURCE、INV_DEST、WAREHOUSE 和 VENDORASN 相同的 SUM(A) - SUM(S)。目前,我正在使用左连接和分组来尝试实现这一目标,但我没有得到任何结果。我知道有满足我需要的记录,但此时我的查询不正确。

我目前有以下查询:

SELECT 
    I1.ITEM,
    SUM(I1.ADJUST_QTY)-SUM(I2.ADJUST_QTY) AS QUANTITY, 
    I1.INV_SOURCE, 
    I1.INV_DEST,
    I1.WAREHOUSE,
    I1.VENDORASN 
FROM    
    INV_ADJUSTMENT I1 
LEFT JOIN 
    INV_ADJUSTMENT I2 
ON (I2.ADJUST_TYPE='S' 
    AND I2.WAREHOUSE=I1.WAREHOUSE                                     
    AND I2.ITEM=I1.ITEM 
    AND I2.INV_SOURCE=I1.INV_SOURCE 
    AND I2.INV_DEST=I1.INV_DEST 
    AND I2.VENDORASN = I1.VENDORASN) 
WHERE I1.ADJUST_TYPE='A' 
GROUP BY 
    I1.ITEM,
    I1.INV_SOURCE,
    I1.INV_DEST,
    I1.WAREHOUSE,
    I1.VENDORASN, 
    I2.ITEM,
    I2.INV_SOURCE,
    I2.INV_DEST,
    I2.WAREHOUSE,
    I2.VENDORASN;
4

4 回答 4

0

你能看看下面的查询是否有效。在子查询中添加剩余的连接。

SELECT l.ITEM,         
   l.ADJUST_QTY - (SELECT ADJUST_QTY 
              FROM INV_ADJUSTMENT x
              WHERE x.ITEM = l.ITEM
              LIMIT 1) total
FROM INV_ADJUSTMENT l Where l.ADJUST_TYPE = 'S';

这是小提琴

于 2013-11-14T16:46:22.293 回答
0

我认为您可能使情况过于复杂。尝试这个:

SELECT 
 I1.ITEM, 
 SUM(I1.ADJUST_QTY \* case I1.ADJUST_TYPE when 'S' then -1 else 1 end),
 I1.INV_SOURCE, 
 I1.INV_DEST,I1.WAREHOUSE,I1.VENDORASN 
FROM 
 INV_ADJUSTMENT I1 
GROUP BY 
 I1.ITEM,I1.INV_SOURCE,I1.INV_DEST,I1.WAREHOUSE,I1.VENDORASN;

\请注意,我必须在乘法运算符之前放置一个反斜杠 ( ) *SUM()否则我无法发布答案。测试查询时删除反斜杠。

于 2013-11-14T20:01:58.273 回答
0

只要能像这样分组,那么这个计算应该比乘法快。(为什么人们总是这样做?)它还会忽略任何不是“A”或“S”的行。只要这是一个罕见的事件(如果有的话),那么在这种情况下处理它应该更快,而不是在 WHERE 子句中执行额外的测试。

SELECT ITEM, 
       SUM(case ADJUST_TYPE 
             when 'A' then ADJUST_QTY 
             when 'S' then 0 - ADJUST_QTY
             else null 
          end) as tot_qty,
       INV_SOURCE, 
       INV_DEST,
       WAREHOUSE,
       VENDORASN 
  FROM INV_ADJUSTMENT 
  GROUP BY ITEM, INV_SOURCE, INV_DEST, WAREHOUSE, VENDORASN
于 2013-11-14T23:22:05.650 回答
0

尝试这个

SELECT 
  ITEM, 
  INV_SOURCE, 
  INV_DEST, 
  WAREHOUSE, 
  VENDORASN, 
  SUM( ( if ( ADJUST_TYPE ='S', -ADJUST_QTY , ADJUST_QTY ) ) ) AS ADJUSTMENT
FROM INV_ADJUSTMENT
GROUP BY ITEM, INV_SOURCE, INV_DEST, WAREHOUSE, VENDORASN
于 2013-11-14T15:45:54.143 回答