2

次のクエリがあります。

select bb.Name, COUNT(*) as Num from BOutcome bo 
JOIN BOffers bb ON bo.ID = bb.BOutcomeID 
WHERE bo.EventID = 123 AND bo.OfferTypeID = 321 AND bb.NumA > bb.NumB 
GROUP BY bb.Name

テーブルは次のようになります。

Name | Num A | Num B
 A   |   10  |   3
 B   |   2   |   3
 C   |   10  |   3
 A   |   9   |   3
 B   |   2   |   3
 C   |   9   |   3

予想される出力は次のようになります。

Name | Count
 A   |   2 
 B   |   0  
 C   |   2  

name が A と C の場合、Num A は Num B よりも大きく、Name が B の場合、両方のレコードで Num A は Num B よりも小さいためです。

私の現在の出力は次のとおりです。

Name | Count
 A   |   2 
 C   |   2   

B の出力は 0 であるため、クエリで返されません。

クエリの何が問題になっていますか? どうやって戻せばいいですか?

4

2 に答える 2

5

これが私の推測です。これは、人々が車輪を回転させてきたすべての左/右結合フープよりもはるかに単純なアプローチだと思います。クエリの出力は左側のテーブルの列のみに依存するため、明示的な結合はまったく必要ありません。

SELECT 
  bb.Name, 
  [Count] = SUM(CASE WHEN bb.NumA > bb.NumB THEN 1 ELSE 0 END)
  -- just FYI, the above could also be written as:
  -- [Count] = COUNT(CASE WHEN bb.NumA > bb.NumB THEN 1 END)
FROM dbo.BOffers AS bb
WHERE EXISTS 
(
    SELECT 1 FROM dbo.BOutcome 
    WHERE ID = bb.BOutcomeID
    AND EventID = 123
    AND OfferTypeID = 321
)
GROUP BY bb.Name;

もちろん、OP では 2 つのテーブルについて説明していますが、サンプル データには 1 つのテーブルしか表示されていないため、Name と NumA/NumB の両方が左側のテーブルにあるかどうかはわかりません。私の推測は、「機能している」と彼が言うクエリに基づいていますが、明示的な結合のために行が欠落しています。

于 2012-06-07T14:01:04.693 に答える
0

別のワイルドな推測。お気軽に反対票を投じてください:

SELECT ba.Name, COUNT(bb.BOutcomeID) as Num 
FROM 
        ( SELECT DISTINCT ba.Name
          FROM 
                  BOutcome AS b
              JOIN
                  BOffers AS ba
                      ON  ba.BOutcomeID  = b.ID
          WHERE b.EventID = 123 
            AND b.OfferTypeID = 321
        ) AS ba
    LEFT JOIN 
        BOffers AS bb 
            ON  AND bb.Name = ba.Name
            AND bb.NumA > bb.NumB
GROUP BY ba.Name ;
于 2012-06-07T13:51:33.037 に答える