2012-06-07 2 views
2

У меня есть следующий запрос:Return (*), даже если 0

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 

Поскольку когда имя A и C, тогда Num A больше во времени, чем Num B, а когда Name - B, в обеих записях Num A меньше, чем Num B.

Мой выходной ток:

Name | Count 
A | 2 
C | 2 

Поскольку выход B является 0, я не получаю его обратно в моем запросе.

Что не так с моим запросом? как мне его вернуть?

+2

Вы говорите: «Таблица выглядит так:», но в вашем запросе упоминаются две таблицы. Вы можете быть более конкретным, пожалуйста? –

+0

Вы пытались выполнить 'LEFT JOIN'? – abatishchev

+2

@abatishchev Серьезно, вы просто оставили это в качестве ответа? – casperOne

ответ

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; 

Конечно, мы не действительно уверен, что как имя и Нума/NumB находятся в левой таблице, так как OP говорит о двух таблицах, но показывает только одну таблицу в данных образца. Моя догадка основана на запросе, который он говорит, «работает», но пропускает строки из-за явного соединения.

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 ; 
+0

Я действительно получаю двойной подсчет с этим запросом (я предполагаю из-за двойного соединения). –

+0

Да, подход 'EXISTS' выглядит лучше. Это можно было бы переписать сначала сгруппированием, а затем с 2-го соединения, но этот вопрос меня устал. –

Смежные вопросы