【问题标题】:Counting duplicate items in different order以不同的顺序计算重复项目
【发布时间】:2015-01-12 11:09:23
【问题描述】:

目标: 了解我们是否在不同的采购订单中多次购买了重复的 StockCodes 或 Stock Description

所以,如果我们在采购订单 1 和采购订单 2 上购买 Part ABC,它应该返回结果

采购订单、零件编号、数量

采购订单1、采购订单2、ABC、2

我只是不知道如何将整个代码组合在一起,更重要的是,如果不滚动查看所有结果,我如何知道它是否发生在超过 1 个采购订单上,也可能与 Multiple (有 Count) 语句,就像我似乎只在 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 

使用回复我想出了以下内容

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

这将返回以下内容,这开始更有帮助 在结果行 2,3,4 中,我们可以看到相同的股票代码 (*30044) 在不同的位置订购了 3 次
采购订单。

我想问题是,是否可以查看是否在 30 天内多次订购了某样东西。 这可能吗?

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 

【问题讨论】:

  • 在你的结果中,Purchase Order1, Purchase Order2, ABC, 2,2 应该代表什么?
  • 选择(你想要的)除了选择(区分你想要的)
  • 这是返回的行结果集,因此如果股票代码 ABC 出现在 2 个采购订单上,它将返回它出现的两个采购订单

标签: sql-server count having


【解决方案1】:
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;

如果您只对股票代码进行重复数据删除,这应该可以工作。我有点不清楚您是想同时对股票代码和股票描述进行重复数据删除,还是对股票代码或股票描述进行重复数据删除。

我也不清楚您的退货列,因为看起来您几乎想要旋转列,以便两个采购订单号出现在同一行。

【讨论】:

  • 嗨,如果 StockCode 或 StockDescription 出现在多个采购订单上,我要做的基本上是返回 StockCode、StockDescription、采购订单 - 我之前没有使用过 Over/Partition - 什么结果集是否返回,是否只是 stockcode 或 desc 出现的次数?
  • 也许,需要一种不同的方法。
猜你喜欢
  • 2016-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多