2016-11-26 12 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 

私はあなたのいくつかは、すでに見てきた確信している問題を必要

。以前の数にアクションの数が乗算されました。

私はこれがなぜ起こるのか見ることができますが、これを行うにはどうすればよいか分かりませんので、乗算器なしでアクション数と正しいカウント数を得ることができます。

あなたはCOUNT(DISTINCT PRStatusChangesLog.id)のようなDISTINCTで一意の列をカウントすることができ

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

OKは問題を強調している簡潔な完全なクエリを追加しました – Rode

答えて

1
  1. 簡体完全なクエリ。
  2. これが不可能な場合は、アクションをカウントするためにサブクエリを使用してください。その後、個別にカウントを取得し、最終的な外側のSELECT文を追加するために参加するには、SELECT文の句を使用して(SELECT COUNT(DISTINCT a.ActionId) FROM ... WHERE PRAction a on a.PrId = PRHeader.prid) AS action_count
+0

あなたは正しいです!、シンプルな独特のトリックでした、私はそれを試していたが、間違った場所で、私はその場合には使用しないと思った。 – Rode

0

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 
関連する問題