2017-02-14 15 views
0

質問をどのようにフィルタリングすることができないか考えています。私は検索結果を得て、その結果をもとに、指定された週の間、「EACH」および「CASE」または「INNER」として注文された商品を表示したいだけです。現時点では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] 
+2

だけでなく、いくつかの "INNER" の行を追加します。 – jarlh

+0

「CASE」レコードと「EACH」レコードしかないため、31113を除外していることを理解します。しかし、「特定の週」のデータを選択した場合、結果にはどのように2つの異なる週が含まれますか?あなたの結果に含まれていない31111と31112の2つのレコードを却下するルールはありますか? –

+0

@ThorstenKettner倉庫から注文を選ぶ場合は、ボックスを開いてEACHを発送するのではなく、内部またはケースを選択する方がはるかに効率的です。だから私たちは現在販売されている商品をそれぞれの商品として特定しようとしていますが、内部やケースとして販売して効率を改善しようとしています。しかし、変化がもたらす可能性のある過去の売上に基づいて、どのような測定可能な影響があるかを知る必要があります。 – MattC

答えて

1

あなたは一週間とアイテムごと「はそれぞれ」と「INNER」/「CASE」を数えるだけの両方で試合を持っているものを週/アイテムのペアを示すだろう。

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; 
+0

優秀!ありがとうございました! – MattC

0

私が正しく理解していれば、次のクエリはこのトリックを行う必要があります。 UnitMeasures INNERはすべて有効とみなされ、EACHとCASEのすべてのペアが有効であるとみなされます。 :

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 
1
declare @T TABLE(
    Weekno  INT, 
    Itemno  INT, 
    UnitofMeasure VARCHAR(32), 
    ConvQty  INT, 
    Orders INT) 

INSERT @T 
VALUES 
(1, 31111, 'EACH', 1, 5), 
(1, 31111, 'CASE', 144, 10), 
(1, 31111, 'CASE', 144, 11), 
(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) 

SELECT a.* 
FROM @T a 
    JOIN (
     SELECT DISTINCT t.Weekno, t.Itemno 
     FROM @T t 
      CROSS APPLY (SELECT Itemno FROM @T WHERE UnitofMeasure IN ('CASE', 'INNER') AND Weekno = t.Weekno AND Itemno = t.Itemno) c 
     WHERE t.UnitofMeasure = 'EACH' 
    ) q ON q.Itemno = a.Itemno AND q.Weekno = a.Weekno 
+0

偉大な答え。私は一つのことを変えるだろう。 "SELECT *"はq.Weeknoとq.Itemnoを既に完全な結果に追加しています。 「SELECT a。*」に変更すると、要求された結果セットが提供されます。この[SQLFiddle](http://sqlfiddle.com/#!3/e14c9/2/0)を参照してください。 – Ethilium

+0

ありがとう、私は私の答えで訂正した –

関連する問題