Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
DB2SQL通过计算具有两种类型的条目的ID来过滤查询结果_Sql_If Statement_Db2_Case - Fatal编程技术网

DB2SQL通过计算具有两种类型的条目的ID来过滤查询结果

DB2SQL通过计算具有两种类型的条目的ID来过滤查询结果,sql,if-statement,db2,case,Sql,If Statement,Db2,Case,在多次尝试之后,我都失败了,希望有人能帮助我。该查询返回用户在工厂中根据订单号和订单号制造项目时所做的每个条目。比如说 Order Number Entry type Quantity 3000 1 1000 3000 1 500 3000 2 300 3000 2 100 4000 2 1000 50

在多次尝试之后,我都失败了,希望有人能帮助我。该查询返回用户在工厂中根据订单号和订单号制造项目时所做的每个条目。比如说

Order Number   Entry type  Quantity
3000          1           1000
3000          1           500
3000          2           300
3000          2           100
4000          2           1000
5000          1           1000
我想要查询做的是像这样返回筛选结果

如果订单号有一个条目类型1和类型2则返回仅为类型1的行 否则,只需返回该订单号的任何类型的行

因此,上述结果将是:

Order Number   Entry type  Quantity
3000          1           1000
3000          1           500
4000          2           1000
5000          1           1000
目前,我的查询(DB2,用非常基本的术语来看是这样的)是正确的,直到一个变更请求通过

从类型为1或类型为2的预订中选择*

谢谢

select * from bookings
    left outer join (
       select order_number,
          max(case when type=1 then 1 else 0 end) + 
             max(case when type=2 then 1 else 0 end) as type_1_and_2
          from bookings
          group by order_number
    ) has_1_and_2 on 
       type_1_and_2 = 2
       has_1_and_2.order_number = bookings.order_number
    where 
        bookings.type = 1 or 
        has_1_and_2.order_number is null
找到同时具有类型1和类型2的所有订单,然后将其合并

如果行与联接匹配,则仅在类型为1时返回它 如果行与联接不匹配(
的类型为2。订单号为空
),则无论类型如何,都返回该行。

A[CTE]通常可以简化逻辑。您可以将其视为将复杂问题分解为概念步骤的一种方法。在下面的示例中,您可以将g看作CTE结果集的名称,然后将其加入到

    WITH g as
    ( SELECT order_number, min(type) as low_type
        FROM bookings
        GROUP BY order_number
    )
    SELECT b.*
      FROM g 
      JOIN bookings b   ON  g.order_number = b.order_number
                        AND g.low_type     = b.type
连接条件将起作用,因此,如果两种类型都存在,则low_类型将为1,并且只选择该类型的记录。如果只有一种类型,它将与low_类型相同


只要bookings表中只允许使用1和2类型,这就可以了。如果没有,您只需在CTE和外部SELECT中添加WHERE子句。

。看来我倒着回答了这个问题。我道歉。上面的编辑应该给你你想要的。