2013-08-28 6 views
1

Я пытаюсь найти элементы, которые показывались один раз или менее в отчете. Я знаю, что, чтобы узнать, сколько раз каждый элемент был включен, я использую это.SQL Count in Where where

select COUNT(VP.VendorPartID) 
from Purchasing.PurchaseOrder PO with (nolock) 
    inner join dbo.tblVendor V with (nolock) 
     on PO.VendorID=V.VendorID 
    inner join Purchasing.PurchaseOrderItem POI with (nolock) 
     on PO.PurchaseOrderID=POI.PurchaseOrderID 
    inner join Purchasing.VendorPart VP with (nolock) 
     on POI.VendorPartID=VP.VendorPartID 
where V.ProductTypeID=4 
group by PO.PurchaseOrderID 

Но я попытался гнезда его внутри другого запроса, чтобы иметь возможность установить, что он должен появиться 1 раз или меньше, и он говорит, что это ошибка, потому что

«Subquery вернулся более чем на 1 значение . Это недопустимо, если подзапрос следует за =,! =, <, < =,>,> = или когда подзапрос используется как выражение. "

Я сделал это, и я предполагаю, что это довольно неправильно, ха-ха.

select VP.VendorPartID,VP.VendorPartDescription 
from Purchasing.PurchaseOrder PO with (nolock) 
    inner join dbo.tblVendor V with (nolock) 
     on PO.VendorID=V.VendorID 
    inner join Purchasing.PurchaseOrderItem POI with (nolock) 
     on PO.PurchaseOrderID=POI.PurchaseOrderID 
    inner join Purchasing.VendorPart VP with (nolock) 
     on POI.VendorPartID=VP.VendorPartID 
where (
     select COUNT(VP.VendorPartID) 
     from Purchasing.PurchaseOrder PO with (nolock) 
      inner join dbo.tblVendor V with (nolock) 
       on PO.VendorID=V.VendorID 
      inner join Purchasing.PurchaseOrderItem POI with (nolock) 
       on PO.PurchaseOrderID=POI.PurchaseOrderID 
      inner join Purchasing.VendorPart VP with (nolock) 
       on POI.VendorPartID=VP.VendorPartID 
     where V.ProductTypeID=4 
     group by PO.PurchaseOrderID 
     ) < 2 
group by VP.VendorPartID,VP.VendorPartDescription 

Желаемые результаты будут

VendorPartID VendorPartDescription 
001   name 1     
002   name 2     
003   name 3     

Это покажет только те, которые появились 1 раз по заказам на покупку.

+0

Почему вы группировки по PurchaseOrderID? Вам нужен общий счетчик или вы хотите подсчитать количество на PurchaseOrderID? Если подзапрос возвращает строку на PurchaseOrderID, вы не можете сравнить набор с числом. Можете ли вы показать некоторые примеры данных и желаемые результаты? Я просмотрел ваш запрос несколько раз, и я не могу его перестроить. Предполагается ли, что фильтр типа находится в подзапросе? Зачем? –

+2

Попробуйте изучить предложение HAVING ... – logixologist

+0

@AaronBertrand - Я хочу, чтобы элементы подсчитывали время, которое они появляются в заказе на покупку, чтобы я мог видеть, какие из них появились только один раз или меньше. – ash

ответ

1

Если это действительно работает для подсчета:

select COUNT(VP.VendorPartID) 
from Purchasing.PurchaseOrder PO with (nolock) 
    inner join dbo.tblVendor V with (nolock) 
     on PO.VendorID=V.VendorID 
    inner join Purchasing.PurchaseOrderItem POI with (nolock) 
     on PO.PurchaseOrderID=POI.PurchaseOrderID 
    inner join Purchasing.VendorPart VP with (nolock) 
     on POI.VendorPartID=VP.VendorPartID 
where V.ProductTypeID=4 
group by PO.PurchaseOrderID` 

Тогда просто добавить having пункт:

select PO.PurchaseOrderID, COUNT(VP.VendorPartID) 
from Purchasing.PurchaseOrder PO with (nolock) 
    inner join dbo.tblVendor V with (nolock) 
     on PO.VendorID=V.VendorID 
    inner join Purchasing.PurchaseOrderItem POI with (nolock) 
     on PO.PurchaseOrderID=POI.PurchaseOrderID 
    inner join Purchasing.VendorPart VP with (nolock) 
     on POI.VendorPartID=VP.VendorPartID 
where V.ProductTypeID=4 
group by PO.PurchaseOrderID 
having COUNT(VP.VendorPartID) <= 1 
3

Предложение HAVING является то, что вам нужно - это как п WHERE, но применяется до GROUP BY

Кое-что из - за:

Select Id, count(othercolumn) 
from sometable 
where somecolumn = something 
group by Id 
having (count(somecolumn) < 2) 
+0

Nice и чистый. Престижность! –

0

Попробуйте, который позволяет получить подробную информацию на основе подсчета

select * from 
(select VP.VendorPartID,VP.VendorPartDescription,COUNT(VP.VendorPartID) as PartCount 
    from Purchasing.PurchaseOrder PO with (nolock) 
    inner join dbo.tblVendor V with (nolock) 
     on PO.VendorID=V.VendorID 
    inner join Purchasing.PurchaseOrderItem POI with (nolock) 
     on PO.PurchaseOrderID=POI.PurchaseOrderID 
    inner join Purchasing.VendorPart VP with (nolock) 
     on POI.VendorPartID=VP.VendorPartID 
group by 
    VP.VendorPartID,VP.VendorPartDescription) as qCounts 
where qCounts.PartCount < 2