2017-04-13 28 views
0

我使用MySQL作爲數據庫。如何編寫SQL查詢來計算滿足具有多列排除的多列條件的值?

我有一個連接表與兩個字段ItemGroupID和CheckNumber適用於此查詢。

一個CheckNumber可以包含多個ItemGroupIDs和ItemGroupIDs可以包含多個CheckNumbers

我試圖計算(即滿足多個條件檢查的次數有項目組281和項目組274,但沒有項目組280或以任何記錄34。這裏的連接表的一個片段。

ItemGroupID | CheckNumber 
----------- ----------- 
    281   101 
    274   101 
    103   101 
    281   101 
    280   102 
    281   102 
    274   102 
    281   103 

對於上述表,該查詢應僅返回計數1爲CheckNumber 101,因爲它具有兩個編號281和274,和它不包含280或34。其他支票號碼不應該返回一個計數。CheckNumber 102有一個排除的Gr支票上的oupID。 CheckNumber 103不包含281 AND 274.

下面是我寫的查詢。查詢的問題是它不會排除使用ItemGroupID 280或34的檢查。我認爲這是GROUP BY中Count函數的問題。但我不確定如何重寫它來解決這個問題。

SELECT COUNT(id.CheckNumber) AS Total 
FROM ItemGroupMember igm 
    INNER JOIN ItemDetail id ON igm.ItemID = id.ItemID 
WHERE igm.ItemGroupID IN (281,274) 
    AND NOT igm.ItemGroupID IN (280,34) 
    AND id.DOB BETWEEN 3/14/2017 AND 3/14/2017 
    AND id.LocationID = 22 
GROUP BY id.CheckNumber HAVING COUNT(DISTINCT igm.ItemGroupID) = 2 

感謝幫助。

+0

缺少一個PIEC e關鍵信息 - 你有什麼問題。你清楚地解釋你想達到的目標,並展示你所嘗試過的,但並沒有解釋你的嘗試尚未奏效的原因。使用該信息快速更新您的問題 – Takarii

+0

@Takarii感謝您的建議,只是使用我的查詢獲得的問題進行編輯。 –

回答

1

怎麼樣:

數據:

create table exp (
    ItemGroupID int, 
    CheckNumber int 
); 

    Insert into exp values (281, 101) ; 
    Insert into exp values (274, 101) ; 
    Insert into exp values (103, 101) ; 
    Insert into exp values (281, 101) ; 
    Insert into exp values (280, 102) ; 
    Insert into exp values (281, 102) ; 
    Insert into exp values (274, 102) ; 
    Insert into exp values (281, 103) ; 

查詢:

Select checknumber, count(*) 
From exp 
Where 
exists (Select e1.ItemGroupID From exp e1 Where e1.checknumber = exp.checknumber and e1.ItemGroupID in (281)) 
and exists (Select e1.ItemGroupID From exp e1 Where e1.checknumber = exp.checknumber and e1.ItemGroupID in (274)) 
and not exists (Select e1.ItemGroupID From exp e1 Where e1.checknumber = exp.checknumber and e1.ItemGroupID in (280, 34)) 
Group by checknumber 

真實數據:

Select checknumber, count(*) 
From (Select * From ItemGroupMember igm INNER JOIN ItemDetail id ON igm.ItemID = id.ItemID WHERE id.DOB BETWEEN 3/14/2017 AND 3/14/2017 AND id.LocationID = 22) exp 
Where 
    exists (Select e1.ItemGroupID From (Select * From ItemGroupMember igm INNER JOIN ItemDetail id ON igm.ItemID = id.ItemID WHERE id.DOB BETWEEN 3/14/2017 AND 3/14/2017 AND id.LocationID = 22) e1 Where e1.checknumber = exp.checknumber and e1.ItemGroupID in (281)) 
    and exists (Select e1.ItemGroupID From (Select * From ItemGroupMember igm INNER JOIN ItemDetail id ON igm.ItemID = id.ItemID WHERE id.DOB BETWEEN 3/14/2017 AND 3/14/2017 AND id.LocationID = 22) e1 Where e1.checknumber = exp.checknumber and e1.ItemGroupID in (274)) 
    and not exists (Select e1.ItemGroupID From (Select * From ItemGroupMember igm INNER JOIN ItemDetail id ON igm.ItemID = id.ItemID WHERE id.DOB BETWEEN 3/14/2017 AND 3/14/2017 AND id.LocationID = 22) e1 Where e1.checknumber = exp.checknumber and e1.ItemGroupID in (280, 34)) 
Group by checknumber 
+0

謝謝演示。看起來這是一個解決方案。不幸的是,我沒有權限在當前環境中創建表,除非我將表導出爲ex​​cel,然後導入本地託管的數據庫。 –

+0

這些只是虛擬數據,而不是exp,你會填寫你的querry作爲子查詢。我認爲「HAVING COUNT(DISTINCT igm.ItemGroupID)= 2」不是它的一部分。我會試着將這個添加到答案 – Demo

+0

@Robert Abdallah我編輯了答案。那樣有用嗎?我不完全確定你想要計算什麼,所以我只計算了每個選定CheckNumber中ItemGroupID的出現次數。 – Demo

0
SELECT COUNT(id.CheckNumber) AS Total 
FROM ItemDetail id 
JOIN ItemGroupMember igm ON igm.ItemID = id.ItemID AND igm.ItemGroupID IN (281,274) 
LEFT JOIN ItemGroupMember igm2 ON igm2.ItemID = id.ItemID AND igm2.ItemGroupID IN (280,34) 
WHERE 
    id.DOB BETWEEN 3/14/2017 AND 3/14/2017 
    AND id.LocationID = 22 
    AND igm2.ItemID is null -- Make sure that you exclude any where the groupID is 280 or 34 
group by id.CheckNumber having Total = 2; 
+0

感謝您的幫助。這看起來很有希望,但多個內部聯接沒有返回記錄。任何解決這個問題?另外,如果我理解正確,那麼'爲空'操作符會選擇沒有280,34項目組的記錄,對嗎?但由於該例中的CheckNumber 102的記錄爲281,另一個記錄爲280,280將被刪除,但281仍然在那裏。因此,支票號碼102會計爲1? –

相關問題