这是我第一次在这里提问,所以如果我能提供更多数据来帮助你协助我,请告诉我:))
目前,我有一张类似于以下内容的表格:
ID ITEM ADJUST_QTY ADJUST_TYPE INV_SOURCE& n bsp; INV_DEST仓库VENDORASN
1 A12 100中的NULL ALLOC 1001 NULL
2 A12 50秒NULL ALLOC 1001 NULL
3 A12为100S NULL UN-ALLOC 1001 12345
4 A12 50甲NULL UN-ALLOC 1001 12345
5 B12 100甲ALLOC UN-ALLOC 1002 NULL
6 B12 100甲UN-ALLOC ALLOC 1002 NULL
我的查询输出应为:
项目ADJUST_QTY INV_SOURCE INV_DEST仓库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 = Add和S = Subtract。我试图找到SUM(A) - SUM(S),其中ITEM,INV_SOURCE,INV_DEST,WAREHOUSE和VENDORASN是相同的。目前,我正在使用左连接和分组来尝试实现此目的但我没有得到任何结果。我知道有些记录可以满足我的需要,但此时我的查询不正确。
目前我有以下问题:
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;
答案 0 :(得分: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
答案 1 :(得分: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';
以下是fiddle
答案 2 :(得分: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()
),否则我无法发布答案。在测试查询时删除反斜杠。
答案 3 :(得分: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