Проблема с использованием функции подсчета в SQL

Я запускаю этот запрос, чтобы подсчитать общее количество продаж забронированных пользователей со страховкой и общее количество продаж без страховки. Однако по какой-то причине все пользователи получают одинаковый счет. как я могу изменить свой запрос, чтобы вместо этого отображались итоги каждого пользователя.

что я хочу, так это выяснить, сколько бронирований у каждого пользователя было со страховкой и без нее

bookedby — агент

а T0 — это таблица, содержащая информацию о бронированиях, не включающих страховку.

t1 — таблица, содержащая информацию о бронированиях со страховкой

в то время как обе таблицы предоставляют одинаковую информацию, как я могу получить общее количество забронированных для каждого агента из обеих таблиц

 SELECT   t0.BookedBy, count(t0.resnumber) as NonInsurance, COUNT(t1.resnumber) as Insurance  
    FROM (SELECT BookedBy, ResNumber, DATEPART(year, BookDate) AS Year, DATEPART(month, BookDate) AS month
              FROM dbo.ResGeneral
              WHERE ResNumber NOT IN (SELECT ResNumber FROM dbo.ResItinerary_insurance) 
                  and  ResStatus = 'a'
              GROUP BY BookedBy, ResNumber, BookDate) t0 
        left JOIN (SELECT BookedBy, ResNumber, DATEPART(year, BookDate) AS Year, DATEPART(month, BookDate) AS month
                       FROM dbo.ResGeneral
                       WHERE ResNumber IN (SELECT ResNumber FROM dbo.ResItinerary_insurance)
                           and  ResStatus = 'a') t1         
            ON t1.year = t0.year         
    group by t0.bookedby

person HELP_ME    schedule 03.10.2011    source источник


Ответы (2)


Я думаю, что этот запрос эквивалентен:

SELECT g.BookedBy,
       SUM(CASE WHEN i.ResNumber IS NULL THEN 1 ELSE 0 END) AS NonInsurance,
       SUM(CASE WHEN i.ResNumber IS NOT NULL THEN 1 ELSE 0 END) AS Insurance
    FROM dbo.ResGeneral g
        LEFT JOIN dbo.ResItinerary_insurance i
            ON g.ResNumber = i.ResNumber
    WHERE g.ResStatus = 'a'
    GROUP BY g.BookedBy;
person Joe Stefanelli    schedule 03.10.2011

Ваше условие присоединения выглядит неверным:

 ON t1.year = t0.year 

Это приведет к перекрестному объединению всех строк с одним и тем же годом. Возможно, вы захотите использовать более конкретное условие, например t1.BookedBy = t0.BookedBy.

person Mark Byers    schedule 03.10.2011
comment
хм, это не сработало, потому что я не пытаюсь суммировать фактическое число разрешений. я хочу в основном выяснить, сколько бронирований у каждого пользователя было со страховыми продажами и без них. - person HELP_ME; 04.10.2011
comment
проблема с t1.BookedBy = t0.BookedBy заключалась в том, что не у всех агентов есть бронирование в обеих таблицах - person HELP_ME; 04.10.2011
comment
@bugz: t1.BookedBy = t0.BookedBy в ЛЕВОМ ВНЕШНЕМ СОЕДИНЕНИИ не требует, чтобы все агенты имели бронирование в обеих таблицах... только в ЛЕВОЙ таблице (отсюда ЛЕВО ВНЕШНЕЕ СОЕДИНЕНИЕ). Возможно, вам нужно FULL OUTER JOIN? Это будет включать строки из обеих таблиц. - person Mark Byers; 04.10.2011