2016-11-29 139 views
1

我正在處理一個需要顯示訂單的報表查詢,它包含p型項目和其他非p項目(非P項目是50項目),他們想要訂單詳細信息, itemsSQL查詢幫助在哪裏條件

下面是我準備好的查詢,但是這個查詢還顯示不與非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

嗨,歡迎來到SO。爲了幫助我們需要更多的細節。這裏是一個開始的好地方。 http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –

回答

1

我不知道爲什麼在你的子查詢中的列是不同的,但我不認爲這是你麻煩的根源。

您正在使用您的子查詢來確保您要返回的每一行都有一個項目,其順序爲'pi'。這與你所說的你想要做的有些不同。下面

查詢返回是有另一行爲onumber這也是'pi''nonpi'但不一樣cat,因爲它是針對檢查行'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

嗨,我有非p項目類型超過50不同的類別(除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可以減少它在加入之前處理的記錄集,這可能導致更好的優化。