在查询400中计数未正确传递

时间:2014-09-23 13:54:16

标签: sql ibm-midrange db2-400

我有一个包含这样的订单数据的表:表Order_Detail和Item_Master通过Item#连接 我们想报告订单号, Order_Detail表:

Order#     Item#              

1234       IPhone6 
1234       IPhone5
1234       Battery

join Item_Master:

Item#            Item_type    Desc

IPhone6          Phone        Smartphone
IPhone5          Phone        Smartphone

现在我们只需要订单号,只有一个Item-Type = Phone。我们只对手机类型感兴趣。我尝试使用Query / 400并对订单#sn = Phone进行计数,然后仅计数= 1.但是这确实带来了一些具有多个电话类型=电话的订单,在我们的例子中我们不会想要这个订单。

3 个答案:

答案 0 :(得分:3)

你的问题有点令人困惑。您是否希望获得Item_Type = 'Phone'的订单号?如果是这样,下面的内容对您有用:

SELECT COUNT(DISTINCT OrderNum) AS OrderNumCount
FROM Order_Detail o
INNER JOIN Item_Master i ON o.ItemNum = o.ItemNum
WHERE Item_type = 'Phone'

或者您是仅仅处理了项目表中只有一条记录链接的订单。如果是这样,那么你可能想要:

SELECT o.OrderNum
FROM Order_Detail o
INNER JOIN Item_Master i ON o.ItemNum = o.ItemNum
WHERE Item_type = 'Phone'
GROUP BY o.OrderNum
HAVING COUNT(*) = 1 

答案 1 :(得分:2)

您可以尝试类似

的内容
SELECT o.OrderNum 
FROM 
  Order_Detail o 
INNER JOIN 
  Item_Master m
On o.ItemNum = m.ItemNum
WHERE m.Item_Type = 'Phone'
GROUP BY o.OrderNum
HAVING COUNT(*) = 1 

答案 2 :(得分:1)

此查询将返回ordernums,其中唯一订购的商品类型为“phone”

select ordernum
from order_detail od
join item_master im on im.itemnum = od.itemnum
group by ordernum
having count(case when im.item_type <> 'Phone' then 1 end) = 0
and count(*) = 1

如果您想允许多个“手机”订单,则可以删除and count(*) = 1