2

以下は、私の正確なコードです。このクエリは、チーム ID が日付範囲内に存在しない場合を除いて、うまく機能します。チーム ID が指定された日付範囲内に存在しない場合、SQL でチーム ID をテーブルに追加し、そのカウントを 0 に設定します。その後、テーブルは自動的にチーム ID をチーム テキストに変換します。

SELECT tn.teamtext, COUNT(referteamID2) AS cnt
FROM teamnames AS tn
JOIN caseaudit AS ca
ON tn.teamID = ca.referteamID2
WHERE CONVERT(smalldatetime,dModLast,101) BETWEEN '2012-03-01' AND '2012-03-10'
AND ca.referteamid1 <> ca.referteamid2
AND teamid IN (99, 107, 124, 27, 31, 44, 110, 43, 57, 50, 46)
GROUP BY tn.teamtext
ORDER BY tn.teamtext

これは以下を返します:

4H BOSS                59
ASSET MANAGEMENT       16
BOSS                   5
CUSTOMER SUPPORT       133
NETWORK ENGINEERING    15
PRODUCTION ENGINEERING 142
SECURITY               6
VOICE SERVICES         21
XEROX                  8

日付の制約を与えた後に IN を使用すると、問題が発生する可能性があると言われました。

4

2 に答える 2

2

条件を WHERE 句から SELECT の CASE ステートメントに移動します。

SELECT tn.teamtext,
       sum(case when CONVERT(smalldatetime,dModLast,101) BETWEEN '2012-03-01' AND '2012-03-10' 
                then 1 else 0
           end) AS cnt
FROM teamnames AS tn JOIN
     caseaudit AS ca
     ON tn.teamID = ca.referteamID2
WHERE ca.referteamid1 <> ca.referteamid2 AND
      teamid IN (99, 107, 124, 27, 31, 44, 110, 43, 57, 50, 46)
GROUP BY tn.teamtext
ORDER BY tn.teamtext 
于 2012-06-01T18:07:51.900 に答える
1

これが効果的なアプローチであるかどうかはわかりませんが、外部結合を試すことができます。

SELECT tn.teamtext, SUM(case when ca.referteamID2 is null then 0 else 1) AS cnt
FROM teamnames AS tn
LEFT OUTER JOIN caseaudit AS ca
ON tn.teamID = ca.referteamID2
WHERE CONVERT(smalldatetime,dModLast,101) BETWEEN '2012-03-01' AND '2012-03-10'
AND ca.referteamid1 <> ca.referteamid2
AND teamid IN (99, 107, 124, 27, 31, 44, 110, 43, 57, 50, 46)
GROUP BY tn.teamtext
ORDER BY tn.teamtext
于 2012-06-01T18:32:42.470 に答える