Math 1表上的条件值减法

Math 1表上的条件值减法,math,db2,conditional-statements,conditional-operator,Math,Db2,Conditional Statements,Conditional Operator,这是我第一次在这里提问,所以请让我知道我是否可以提供更多数据来帮助您帮助我:) 目前,我有一张类似于以下内容的表格: IDITEMADJUST_QTYADJUST_TYPEINV_SOURCE&n bsp;库存仓库供应商 1A12100Anulalloc1001Null 2A1250SNULLLALLOC1001NULL 3A12100SNULLUN-ALLOC100112345 4A1250ANULLUN-ALLOC100112345 5B12100AALLOCHUN-ALLOC1002NUL

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


目前,我有一张类似于以下内容的表格:
IDITEMADJUST_QTYADJUST_TYPEINV_SOURCE&n bsp;库存仓库供应商
1A12100Anulalloc1001Null
2A1250SNULLLALLOC1001NULL
3A12100SNULLUN-ALLOC100112345
4A1250ANULLUN-ALLOC100112345
5B12100AALLOCHUN-ALLOC1002NULL
6B12100AUN-ALLOC1002NULL

我的查询的输出应该是:
ITEMADJUST_QTYNV_SOURCEINV_DestWarehouse供应商编号
A1250NullAlloc100Null(这是ID 1-ID 2)
A12-50NULLUN-ALLOC100112345(这是ID 4-ID 3)
B12100ALOC1002NULL(这是ID 5)
B12100UN-ALLOCALLOC1002NULL(这是ID 6)

调整类型A=加法,S=减法。我正在尝试查找项目、库存来源、库存目的地、仓库和供应商相同的总和(A)-总和。目前,我正在使用左连接和分组方式来尝试实现这一点,但我没有得到任何结果。我知道有满足我需要的记录,但我的查询在这一点上是不正确的

我现在有以下疑问:

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;
试试这个

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

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

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';

这是我想你可能把情况复杂化了。试试这个:

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()
中的乘法运算符
*
之前加一个反斜杠(
\
),否则我无法给出答案。测试查询时请删除反斜杠。

只要您可以这样分组,那么此计算应该比乘法更快。(为什么人们总是这样做?)它也会忽略任何不是“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

注意,我忘了添加。我现在正在使用DB2。当我运行上述语句时,我得到SQLCODE=-104,SQLSTATE=42601,SQLERRMC==;在符号“token”处检测到与语法错误相对应的DJUST_类型。不确定是什么原因导致了问题,因为列名拼写正确。OP被标记为mysql,所以这就是我写的内容。:)我没有访问DB2进行测试的权限,也没有任何重要的经验。您的最终生产环境是DB2还是mysql?不幸的是,DB2。我们的应用程序是为SQL构建的,但是这个特定的客户使用DB2并且不会切换:(Bummer。我确信您不需要连接,而是需要一个组。在函数中放置一个条件可能会对您在mysql中添加多少组参数有点挑剔:)-所以我怀疑这就是问题所在。但是,我还是不知道DB2。您可能需要重新标记问题。谢谢。做了编辑。我会把你给的东西弄得一团糟,也许会尝试使用Case。再次感谢你的帮助!为什么每个人都编写代码来乘以-1?计算机从零开始减法的速度要快得多。@WarrenT-我们可以看一下性能比较吗?它对CPU指令的基本理解。写一个循环将int x=x*-1相乘一百万次,另一个循环将int y=0-y相减一百万次。在C或类似的语言中,您应该看到一个实质性的区别。在这样的SQL查询中,总体影响是微不足道的。因此,一方面,担心它没有什么意义,另一方面,为什么我们(作为一个专业人员)不应该习惯性地选择更简单、更高效的选项呢?尽管这是事实,但它可能是一个易读性的问题,特别是在给SQL语句增加复杂性时。我在一个小型515模型上的1.9M行表上运行了SQLRPGLE模块中的两个表单,以查看它有多大的不同。对于(x=x*-1)形式,三次运行的时间平均为51.031秒,对于(y=0-y),时间平均为46.325秒。在大多数情况下,这一差异可能不太重要。SQL背后的编译代码量往往掩盖了数学中的微小代码。(顺便说一句,对于简单的数学循环来说,差异也几乎一样小。)与期望的结果相比,你的小提琴给出了错误的答案。它也没有包含足够的列或行,当您更接近时,可以正确地进行测试。另外,它是mySql,而不是DB2,尽管一个可移植的答案是很有可能的。(我的几乎是便携式的)