Счетчик в запросе 400 не проходит правильно

У меня есть таблица с такими данными заказа: Таблица Order_Detail и Item_Master объединены номером позиции. Мы хотим сообщить номер заказа, таблицу 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. Нас интересуют только типы Phone. Я попытался использовать Query/400 и выполнить подсчет для заказа №, который = Телефон, а затем взять только подсчеты = 1. Но это действительно приводит к некоторым заказам, которые имеют более одного типа телефона = Телефон, в нашем примере здесь мы не будем хочу этот заказ.


person Paul K.    schedule 23.09.2014    source источник


Ответы (3)


этот запрос вернет номер заказа, где единственным типом заказанного товара является «телефон».

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

person FuzzyTree    schedule 23.09.2014

Ваш вопрос немного сбивает с толку. Вы хотите получить количество номеров заказов, где 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 
person Linger    schedule 23.09.2014
comment
да, но мы хотим пройти дальше, только если count = 1, то есть только одна строка имеет item_type = Phone - person Paul K.; 23.09.2014

Вы можете попробовать что-то вроде

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 
person Ian Kenney    schedule 23.09.2014