Counting duplicate items in different order

96 Views Asked by At

Goal: To know if we have purchased duplicate StockCodes or Stock Description more than once on difference purchase orders

So, if we purchase Part ABC on Purchase Order 1 and Purchase Order 2, it should return the result of

PurchaseOrders, Part#, Qty

Purchase Order1, Purchase Order2, ABC, 2

I just don't know how to pull the whole code together, more to the point, how do I know if it's occurred on more than 1 Purchase Order without scrolling through all the results , may also have to do with Multiple (Having Count) Statements as I only seem to be doing by StockCode

SELECT t1.PurchaseOrder,
       t1.MStockCode,
       Count(t1.MStockCode) AS SCCount,
       t1.MStockDes,
       Count(t1.MStockDes)  AS DescCount
FROM   PorMasterDetail t1
       INNER JOIN PorMasterHdr t2
               ON t1.PurchaseOrder = t2.PurchaseOrder
WHERE  Year(t2.OrderEntryDate) = Year(Getdate())
       AND Month(t2.OrderEntryDate) = Month(Getdate())
GROUP  BY t1.PurchaseOrder,
          t1.MStockCode,
          t1.MStockDes
HAVING Count(t1.MStockCode) > 1 

Using responses I came up with the following

select * from 
(
SELECT COUNT(dbo.InvMaster.StockCode) AS Count, dbo.InvMaster.StockCode AS StockCodes, 
dbo.PorMasterDetail.PurchaseOrder, dbo.PorMasterHdr.OrderEntryDate
FROM  dbo.InvMaster INNER JOIN  dbo.PorMasterDetail ON 
dbo.InvMaster.StockCode =  dbo.PorMasterDetail.MStockCode 
INNER JOIN dbo.PorMasterHdr ON dbo.PorMasterDetail.PurchaseOrder = dbo.PorMasterHdr.PurchaseOrder
WHERE YEAR(dbo.PorMasterHdr.OrderEntryDate) = YEAR(GETDATE())
GROUP BY dbo.InvMaster.StockCode, dbo.InvMaster.StockCode,  
dbo.PorMasterDetail.PurchaseOrder, dbo.PorMasterHdr.OrderEntryDate
) Count
Where Count.Count > 1

This returns the below , which is starting to be a bit more helpful In result line 2,3,4 we can see the same stock code (*30044) ordered 3 times on different
purchase orders.

I guess the question is, is it possible to look at If something was ordered more than once within say a 30 day period. Is this possible?

Count   StockCodes  PurchaseOrder   OrderEntryDate
2   *12.0301.0021   322959      2014-09-08 
2   *30044          320559      2014-01-21 
8   *30044          321216      2014-03-26 
4   *30044          321648      2014-05-08 
5   *32317          321216      2014-03-26 
4   *4F-130049/TEST 323353      2014-10-22 
5   *650-1157/E     322112      2014-06-24 
2   *650-1757       321226      2014-03-27 
1

There are 1 best solutions below

2
On
SELECT *
FROM
(
  SELECT h.OrderEntryDate, d.*,
  COUNT(*) OVER (PARTITION BY d.MStockCode) DupeCount
  FROM
  PorMasterHdr h
  INNER JOIN PorMasterDetail d ON
  d.PurchaseOrder = h.PurchaseOrder
  WHERE
  -- first day of current month
  -- http://blog.sqlauthority.com/2007/05/13/sql-server-query-to-find-first-and-last-day-of-current-month/
  h.OrderEntryDate >= CONVERT(VARCHAR(25), DATEADD(dd,-(DAY(GETDATE())-1),GETDATE()),101)
) dupes
WHERE
dupes.DupeCount > 1;

This should work if you're only deduping on stock code. I was a little unclear if you wanted to dedupe on both stock code and stock desc, or either stock code or stock desc.

Also I was unclear on your return columns because it almost looks like you're wanting to pivot the columns so that both purchase order numbers appear on the same line.