2016-11-29 8 views
1

注文を表示する必要があるレポートクエリで作業していますが、pタイプアイテムと他の非pアイテム(非Pアイテムは50アイテムです)が含まれています。アイテム条件でのSQLクエリヘルプ

以下は私が用意したクエリですが、このクエリは非pアイテムと結合されていないptypeオーダーも表示しています。

SELECT 
    vwOrD.ONUMBER, 
    vwOrD.ITEMID, 
    vwITEMs.cat, 
    vwITEMs.id 
FROM vwITEMs 
INNER JOIN vwOrD 
    ON vwITEMs.ITEMID = vwOrD.ITEMID 
INNER JOIN vwOrders 
    ON vwOrD.ONUMBER = vwOrders.ONUMBER 
WHERE vwOrders.CUSTID  = 'test' 
    AND vwOrders.CREATEDATE >= '1-1-2016' 
    AND vwOrders.CREATEDATE <= '11-28-2016' 
    AND vwOrD.ONUMBER  IN 
    (SELECT vwOrD.ONUMBER 
    FROM vwOrD 
    INNER JOIN vworders 
    ON vwOrD.ONUMBER = vwOrders.ONUMBER 
    INNER JOIN vwITEMs 
    ON vwITEMs.ASCITEMID = vwOrD.ASCITEMID 
    WHERE vwOrders.SOLDTOCUSTID = 'test' 
     AND vwITEMs.cat   = N'PI' -- Pitems cat= pi, id = c 
     AND vwITEMs.id   = 'C' 
     AND vwOrders.CREATEDATE >= '1-1-2016' 
     AND vwOrders.CREATEDATE <= '11-28-2016' --group by   vwOrD.ONUMBER 
     -- having count(1) > 1 
) 
ORDER BY 
    vwOrD.ONUMBER 

生成されたサンプル出力:

ornumber idnum categ id id 
     12 xxx  pi c 
     12 xxx  nonpi c 
     11 yyy  pi c 
     10 qqq  pi c 

結果は、私はあなたのサブクエリ内の列が異なっている理由はわからないんだけど、私はそれはないと思う

12 xxx pi c 
12 xxx nonpi c 
+1

こんにちは、ようこそ。私たちはいくつかの詳細を必要とするのを助けるために。ここから始めましょう。 http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –

答えて

1

を期待あなたのトラブルの根。

サブクエリを使用して、返す行ごとに、その順番にあるアイテムが'pi'のアイテムであることを確認しています。それはあなたがやろうとしていたこととは少し違います。

以下のクエリはまた'pi'又は'nonpi'であるが、それはに対してチェックされる行とcat同じではないことonumberための別の行を有する'pi'または'nonpi'ある行を返します。

select 
    d.onumber 
    , d.itemid 
    , i.cat 
    , i.id 
    from vwitems as i 
    inner join vwOrD as d on i.itemid = d.itemid 
    inner join vwOrders as o on d.onumber = o.onumber 
    where o.custid = 'test' 
    and o.createdate >= '1-1-2016' 
    and o.createdate <= '11-28-2016' 
    and exists (
     select 1 
     from vwOrD 
      inner join vwitems on vwitems.ascitemid = vwOrD.ascitemid /* ascitemid vs itemid ? */ 
      and vwitems.cat = 'Pi' 
      and vwitems.id = 'C' 
      and vwOrD.onumber=o.onumber 
     ) 
    and exists (
     select 1 
     from vwOrD 
      inner join vwitems on vwitems.ascitemid = vwOrD.ascitemid /* ascitemid vs itemid ? */ 
      and vwitems.cat != 'Pi' 
      and vwitems.id = 'C' 
      and vwOrD.onumber=o.onumber 
     ) 
    order by d.onumber;   
+0

こんにちは、私は50以上の非pのアイテムの種類に問題があります異なるカテゴリ(pタイプのアイテム以外は異なるカテゴリと見なされます)、私はそのためにオペレータで使用することはできません。 –

+0

私はあなたが何を意味していると思います、私はクエリを更新しました。 – SqlZim

+0

ありがとう、それは –

0
select 
    d.onumber 
    ,d.itemid 
    ,i.cat 
    ,i.id 
from 
    vwitems as i 
    inner join vwOrD d 
    on i.itemid = d.itemid 
    inner join vwOrders o 
    on d.onumber = o.onumber 
    AND o.custid = 'test' 
    and o.createdate >= '1-1-2016' 
    and o.createdate <= '11-28-2016' 
WHERE 
    EXISTS (SELECT 
      1 
      FROM 
      vmItems i2 
      INNER JOIN vwOrd d2 
      ON i2.itemid = d2.itemid 
      WHERE 
      o.onumber = d2.onumber 
      HAVING 
      COUNT(DISTINCT i.Cat) > 1 
      AND COUNT(CASE WHEN i.Cat = 'Pi' THEN 1 END) > 0) 

これは、別々の2文をEXISTSよりも優れたプリフォームなければなりません。

また、条件付き集計を使用してウィンドウ関数を使用できるように、必要なすべてのテーブルがすでに登録されています。ここにはCommon Table Express [CTE]バージョンがありますが、これも派生テーブルとして配置することもできます。これはもっと良い結果が得られるかもしれません:

;WITH cte AS (
    select 
     d.onumber 
    ,d.itemid 
    ,i.cat 
    ,i.id 
    ,COUNT(CASE WHEN i.Cat = 'Pi' THEN 1 ELSE 0 END) OVER (PARTITION BY o.number) as PiCount 
    ,COUNT(CASE WHEN i.Cat <> 'Pi' THEN 1 ELSE 0 END) OVER (PARTITION BY o.number) as NonPiCount 
    from 
     vwitems as i 
     inner join vwOrD d 
     on i.itemid = d.itemid 
     inner join vwOrders o 
     on d.onumber = o.onumber 
     AND o.custid = 'test' 
     and o.createdate >= '1-1-2016' 
     and o.createdate <= '11-28-2016' 
) 

SELECT * 
FROM 
    cte 
WHERE 
    PiCount > 0 
    AND NonPiCount > 0 

私は部分的にペットの心配のためにこれらの答えをあなたに示したいと思っていました。 ON条件NOT WHERE句に結合上の制約を配置する必要があります。inner joinを実行しているときに、別のものに気が付きませんが、OUTER JOINを使用するとすぐにWHERE句に条件を保存すると、inner joinになります。さらに、ON条件で制限することによって、SQLは、結合する前に扱うレコードセットを減らすことができます。これにより、より良い最適化につながる可能性があります。