2016-11-26 76 views
-1

好的,不是最好的標題,但不能更好地解釋它。SQL避免內部連接與多個返回的乘法

我有一個像這樣的一條SQL查詢。

count(PRStatusChangesLog.EffectiveMinutes) as timeInHandoverExternal 

它的工作原理,到目前爲止,但我也想加入這樣的事情 COUNT (distinct a.ActionId) as 'Number Of Actions'

需要這個

INNER JOIN PRAction a on a.PrId = PRHeader.prid 

現在我確信這個問題一些你已經看到。之前的計數現在乘以動作的數量。

我可以看到爲什麼發生這種情況,但我不確定如何最好地做到這一點,這樣我就可以同時得到沒有乘數的操作次數和正確的計數。

簡體完整的查詢

SELECT 
    PRHeader.PrId, 
    COUNT (distinct a.ActionId) AS 'Number Of Actions', 
    COUNT (PRStatusChangesLog.EffectiveMinutes) AS timeInHandoverExternal 
FROM   
    PRHeader 
LEFT JOIN 
    PRStatusChangesLog ON PRStatusChangesLog.PrId = PRHeader.PrId 
         AND PRStatusChangesLog.StatusId = 4100 
INNER JOIN 
    PRAction a ON a.PrId = PRHeader.prid 
WHERE 
    DATEDIFF(mm, prheader.ClosedDate, getdate()) = 1 
    AND (PRHeader.siteId = 74) 
    AND prheader.PRTypeId IN (17, 19) 
    AND PRHeader.tmpStatusId <> 6010 
GROUP BY 
    PRHeader.PrId 
+1

你能分享一個完整的查詢嗎?回答這個問題有點難,沒有具體的看 – Mureinik

+0

指定您的樣本數據和預期結果,以便於全部回答 – Mansoor

+0

確定添加了一個簡化的完整查詢,突出顯示問題 – Rode

回答

1
  1. 你可以像DISTINCTCOUNT(DISTINCT PRStatusChangesLog.id)唯一列。
  2. 如果這不可行,請使用子查詢來計算操作。在SELECT條款,你應該寫類似:(SELECT COUNT(DISTINCT a.ActionId) FROM ... WHERE PRAction a on a.PrId = PRHeader.prid) AS action_count
+0

你是對的!,一個簡單的截然不同的伎倆,我曾試過,但在錯誤的地方,並認爲我沒有在那種情況下使用它。 – Rode

0

使用select語句子句中加入單獨獲得計數,然後用最後的外部SELECT語句添加。

SELECT 
    PRHeader.PrId, Count1 'Number Of Actions', Count2 timeInHandoverExternal 
FROM 
    PRHeader 
JOIN 
    (SELECT COUNT (ActionId) Count1 
    FROM PRAction 
    GROUP BY PrId) A ON A.PrId = PRHeader.prid 
LEFT JOIN 
    (SELECT 
     COUNT(PRStatusChangesLog.EffectiveMinutes) Count2, PrId, StatusId 
    FROM 
     PRStatusChangesLog 
    WHERE 
     StatusId = 4100 
    GROUP BY 
     PrId, StatusId) B ON B.PrId = PRHeader.PrId 
WHERE 
    DATEDIFF(mm, prheader.ClosedDate, getdate()) = 1 
    AND (PRHeader.siteId = 74) 
    AND prheader.PRTypeId IN (17,19) 
    AND PRHeader.tmpStatusId <> 6010