Sql 如何筛选一个查询,其中一列在另一列中有多个匹配项?

Sql 如何筛选一个查询,其中一列在另一列中有多个匹配项?,sql,sql-server,Sql,Sql Server,很难思考如何过滤我的查询。我有一个查询结果,使用这些结果,我只想显示在给定的一周内,作为“每个”和“案例”或“内部”订购的产品 目前的输出示例: Weekno Itemno UnitofMeasure ConvQty #Orders 1 31111 EACH 1 5 1 31111 CASE 144 10 1

很难思考如何过滤我的查询。我有一个查询结果,使用这些结果,我只想显示在给定的一周内,作为“每个”和“案例”或“内部”订购的产品

目前的输出示例:

Weekno     Itemno     UnitofMeasure     ConvQty     #Orders
1           31111      EACH               1           5
1           31111      CASE               144         10
1           31112      EACH               1           10 
1           31113      CASE               144         2
2           31111      EACH               1           10
2           31112      EACH               1           20
2           31112      CASE               144         15  
2           31113      EACH               1           5
2           31113      INNER              12         20
因此,对于这个示例输出,我只想显示以下结果:

1           31111      EACH               1           5
1           31111      CASE               144         10
2           31112      EACH               1           20
2           31112      CASE               144         15 
2           31113      EACH               1           5
2           31113      INNER              12         20
以下是我目前对如何获得这些结果的查询:

SELECT datepart(ww,[Promised Ship Date]) as weekno
      ,[Item ID]
      ,[UNITOFMEASURE]
      ,[UNITOFMEASURECONV] as ConvQTY
      ,count(*) as Orders
  FROM SalesHistory vw
  inner join ITEMTABLE IT on IT.itemcode = vw.[Item Id]
  where [Promised Ship Date] >= '2016-01-01' and [Promised Ship Date] < '2016-02-01'
  and [UDF_MIN_SALES_UNIT] = 'Each'
  group by datepart(ww,[Promised Ship Date]),[item id],[unitofmeasure],[UNITOFMEASURECONV]
  order by weekno,[item id]
选择datepart(ww,[承诺发货日期])作为weekno
,[项目ID]
,[计量单位]
,[UNITOFMEASURECONV]作为ConvQTY
,将(*)计算为订单
来自大众汽车销售历史
内部连接ITEMTABLE将其放在上面。itemcode=vw。[项目Id]
其中【承诺发货日期】>='2016-01-01'和【承诺发货日期】<'2016-02-01'
和[UDF\u MIN\u SALES\u UNIT]=“每个”
按日期分组部件(ww,[承诺发货日期],[项目id],[计量单位],[计量单位CONV]
按weekno订购,[项目id]

如果我理解正确,下面的查询应该可以做到这一点。它认为所有UnitMeasures内部都是有效的,并且每个和大小写的所有对都是有效的:

DECLARE @t TABLE (Weekno int, Itemno int, UnitofMeasure varchar(10), ConvQty int, NumOrders int);

INSERT INTO @t VALUES
 (1, 31111, 'EACH', 1   , 5  )
,(1, 31111, 'CASE', 144 , 10 )
,(1, 31112, 'EACH', 1   , 10 )     
,(1, 31113, 'CASE', 144 , 2  )
,(2, 31111, 'EACH', 1   , 10 )
,(2, 31112, 'EACH', 1   , 20 )
,(2, 31112, 'CASE', 144 , 15 )     
,(2, 31113, 'CASE', 144 , 5  );


WITH cte AS(
  SELECT Weekno, Itemno, UnitofMeasure, ConvQty, NumOrders, CASE WHEN UnitofMeasure IN ('CASE', 'EACH') THEN 0.5 WHEN UnitofMeasure = 'INNER' THEN 1 END AS x
    FROM @t
),
cteFilter AS(
  SELECT Weekno, Itemno, sum(x) x
     FROM cte
     GROUP BY Weekno, Itemno
     HAVING sum(x) = 1
)
SELECT t.*
  FROM @t AS t
  JOIN cteFilter AS f ON f.Weekno = t.Weekno AND f.Itemno = t.Itemno

如果我理解正确的话,下面的查询应该可以做到这一点。它认为所有UnitMeasures内部都是有效的,并且每个和大小写的所有对都是有效的:

DECLARE @t TABLE (Weekno int, Itemno int, UnitofMeasure varchar(10), ConvQty int, NumOrders int);

INSERT INTO @t VALUES
 (1, 31111, 'EACH', 1   , 5  )
,(1, 31111, 'CASE', 144 , 10 )
,(1, 31112, 'EACH', 1   , 10 )     
,(1, 31113, 'CASE', 144 , 2  )
,(2, 31111, 'EACH', 1   , 10 )
,(2, 31112, 'EACH', 1   , 20 )
,(2, 31112, 'CASE', 144 , 15 )     
,(2, 31113, 'CASE', 144 , 5  );


WITH cte AS(
  SELECT Weekno, Itemno, UnitofMeasure, ConvQty, NumOrders, CASE WHEN UnitofMeasure IN ('CASE', 'EACH') THEN 0.5 WHEN UnitofMeasure = 'INNER' THEN 1 END AS x
    FROM @t
),
cteFilter AS(
  SELECT Weekno, Itemno, sum(x) x
     FROM cte
     GROUP BY Weekno, Itemno
     HAVING sum(x) = 1
)
SELECT t.*
  FROM @t AS t
  JOIN cteFilter AS f ON f.Weekno = t.Weekno AND f.Itemno = t.Itemno

您可以每周计算“每个”和“内部”/“案例”以及项目,并且只显示在这两个方面都匹配的周/项目对

select weekno, itemno, unitofmeasure, convqty, #orders
from
(
  select weekno, itemno, unitofmeasure, convqty, #orders
    , count(case when unitofmeasure = 'EACH' then 1 end) 
            over (partition by weekno, itemno) as cnt_each
    , count(case when unitofmeasure in ('INNER','CASE') then 1 end) 
            over (partition by weekno, itemno) as cnt_inner_or_case
  from mytable
) counted
where cnt_each > 0 and cnt_inner_or_case > 0;

您可以每周计算“每个”和“内部”/“案例”以及项目,并且只显示在这两个方面都匹配的周/项目对

select weekno, itemno, unitofmeasure, convqty, #orders
from
(
  select weekno, itemno, unitofmeasure, convqty, #orders
    , count(case when unitofmeasure = 'EACH' then 1 end) 
            over (partition by weekno, itemno) as cnt_each
    , count(case when unitofmeasure in ('INNER','CASE') then 1 end) 
            over (partition by weekno, itemno) as cnt_inner_or_case
  from mytable
) counted
where cnt_each > 0 and cnt_inner_or_case > 0;

还要添加一些“内部”行。我知道您排除了31113,因为它只有“CASE”记录,没有“EACH”记录。但是,如果您选择“给定的一周”的数据,为什么您的结果包含两个不同的周?还有什么规则让你放弃你的结果不包含的31111和31112的两条记录?@ThorstenKettner在从仓库提货时,提货内部或箱子要比打开箱子分别发货效率高得多。因此,我们正在尝试确定目前作为each销售,但也作为内部或案例销售的项目,以便我们可以尝试提高效率。然而,我们需要看看,根据历史销售额,这些变化可能会产生何种可测量的影响。啊,我明白了。在第1周,仅31111项按每种和每种情况出售;在第2周,这仅适用于31112。@jarlh我在第2周添加了一个内行。还添加了一些“内行”。我知道您排除了31113,因为它只有“case”记录,没有“EACH”记录。但是,如果您选择“给定的一周”的数据,为什么您的结果包含两个不同的周?还有什么规则让你放弃你的结果不包含的31111和31112的两条记录?@ThorstenKettner在从仓库提货时,提货内部或箱子要比打开箱子分别发货效率高得多。因此,我们正在尝试确定目前作为each销售,但也作为内部或案例销售的项目,以便我们可以尝试提高效率。然而,我们需要看看,根据历史销售额,这些变化可能会产生何种可测量的影响。啊,我明白了。在第1周,仅31111项按每种和每种情况出售;在第二周,只有31112是这样。@jarlh我在第二周添加了一个内行。太棒了!非常感谢。杰出!非常感谢。回答得很好。我会改变一件事。“SELECT*”将q.Weekno和q.Itemno添加到a已经完成的结果中。更改为“选择*”将提供请求的结果集。请看这个,回答得很好。我会改变一件事。“SELECT*”将q.Weekno和q.Itemno添加到a已经完成的结果中。更改为“选择*”将提供请求的结果集。请看这个。