2014-02-17 65 views
-1

我有一個查詢,我可以得到正確的。所以這裏是我的場景: 我有一個名爲'Couriers'的父表,然後1名快遞員可能有1個或許多'信使',然後Couriers有一個名爲'控制'的第二個表,我控制信使有多少個信使。 結構是這樣的:我的查詢有什麼問題?

'Courier' 
idCourier(pk) 
181 
162 
101 
'Messenger' 
idMessenger (pk), idCourier (fk) 
1     101 
2     181 
3     101 
4     101 
5     162 

'Control' 
idCourier(pk, fk), maxNumberOfMessengers, idSupervisor 
181    20      146 
181    20      149 
162    10      129 
162    10      130 
162    10      138 
162    10      139 
101    0      83 
101    0      86 

於是用一個查詢:

SELECT COUNT(G.idCourier) AS NUM_COURIER, G.idMessenger, SUM(T.maxNumberOfMessengers) AS TOTAL 
FROM Courier M 
LEFT JOIN Messenger G ON M.idCourier = G.idCourier 
LEFT JOIN Control T ON T.idCourier = G.idCourier AND T.idCourier = M.idCourier 
GROUP BY G.idMessenger 

我得到:

NUM_COURIER G.idMessenger TOTAL 
2    181    40 
4    162    40 
6    101    0 

我期待:

NUM_COURIER G.idMessenger TOTAL 
1    181    40 
3    162    40 
1    101    0 

什麼我想念你嗎? ing或在我的查詢中做錯? 在此先感謝!! :)

+1

你使用的是mysql嗎? SQL服務器?甲骨文? –

+0

我使用oracle – linker85

+0

我認爲你不需要左連接表,而是INNER JOIN –

回答

1

我們每個快遞有多少個使者?

SELECT idCourier, COUNT(*) CourierCount FROM Messenger GROUP BY idCourier 

現在加入這個,並比較控制:

SELECT CO.idcourier, 
     CO.maxnumberofmessengers, 
     CC.couriercount 
FROM control CO 
     INNER JOIN (SELECT idcourier, 
          Count(*) CourierCount 
        FROM messenger 
        GROUP BY idcourier) CC 
       ON CC.idcourier = CO.idcourier 
+0

近乎完美,它缺少maxNumberOfMessengers中的總數以及idCourier和courierCount的一個組合 – linker85

+0

如果'idCourier'是PK,就像您在帖子中指出的一樣,那麼不需要總和,因爲它是唯一的。從你的數據樣本中'idCourier'不是唯一的,但你的表格定義表明它是。如果出現這種情況,您就會遇到數據建模問題,因爲單個快遞可能會定義一些不同的'maxNumberOfMessengers'。如果您需要如您所說的「SUM」,那麼這意味着每個快遞員/管理員組件只是構成總數的一部分'maxNumberOfMessengers' –

0

我以前的查詢錯誤地認爲我們需要計算控制表中的快遞條目的數量,同時也計算了使者的數量。

SELECT COUNT(T.idCourier) AS NUM_COURIER, T.idCourier, SUM(T.maxNumberOfMessengers) AS TOTAL 
    FROM Control T 
    GROUP BY T.idCourier 

我現在看到我們需要得到信使的數量。因此需要子查詢:

SELECT Couriers.CourierCount as NUM_COURIER, Couriers.idCourier, MaxMessengers.TOTAL 
    FROM 
    (SELECT M.idCourier, COUNT(*) CourierCount FROM Messenger M GROUP BY M.idCourier) Couriers 
    JOIN(SELECT C.idCourier, SUM(C.maxNumberOfMessengers) AS TOTAL From Control C GROUP BY C.idCourier) MaxMessengers 
    ON MaxMessengers.idCourier = Couriers.idCourier 
+0

計數和分組在相同的領域不工作得很好。從外部連接到內部連接不會阻止它重複計數。 –

+0

你對外聯合是正確的,我已經將其刪除。我沒有意識到在同一領域的計數和分組效果不佳;它似乎爲我工作,雖然我使用的是SQL Server而不是Oracle。你知道爲什麼這有問題嗎? –

+0

道歉,這是一次性評論 - 我不知道是否有錯誤發生,但這是一個合乎邏輯的問題。從邏輯上講,您要分組或彙總一個列,但從來都不是。 –

0

我不熟悉Oracle,所以我希望這是有益的,因爲這是你將如何與MS SQL做到這一點。

SELECT COUNT(G.idCourier) AS NUM_COURIER, 
m.idcourier, 
(
SELECT sum(maxnumberofmessengers) 
FROM CONTROL con 
WHERE con.idcourier = m.idcourier 
GROUP BY con.idcourier 
) AS TOTAL 
FROM Courier M 
JOIN Messenger G ON M.idCourier = G.idCourier 
GROUP BY m.idcourier 
0
courier

表和control表由idcouriercourier表和連接表messenger也通過idcourier連接,但messenger表和control表在所有未連接。另一件事是idcourier單獨不能根據其數據在control表中輸入pk。它有重複的數據。

select t1.idcourier,cnt,sm 
from (
SELECT COURIER.IDCOURIER, 
    COUNT(MESSENGER.IDMESSENGER) as cnt 
FROM COURIER 
left JOIN MESSENGER 
ON COURIER.IDCOURIER = MESSENGER.IDCOURIER 
GROUP BY COURIER.IDCOURIER) t1 
inner join (
SELECT COURIER.IDCOURIER, 
    SUM(CONTRAL.MAXNUMBEROFMESSENGERS) as sm 
FROM COURIER 
left JOIN CONTRAL 
ON COURIER.IDCOURIER = CONTRAL.IDCOURIER 
GROUP BY COURIER.IDCOURIER)t2 on t1.idcourier = t2.idcourier; 
+0

在您的回答中添加一些說明以進行解釋 – Cris

+0

快遞員表和控制表由idcourier和信使桌和信使桌也由idcourier連接,但信使桌和控制桌根本不連接。另一件事就是idcourier本身不能根據其數據在控制表中找到pk。它有重複的數據。所以我在相關表格上做了單獨的連接,並對兩個子查詢的結果進行了內部連接。 – user3307000