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

#sql-server-2008 #stored-procedures #count

#sql-server-2008 #хранимые процедуры #подсчет

Вопрос:

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

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

bookedby является агентом

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

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

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

  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
  

Ответ №1:

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

 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;
  

Ответ №2:

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

  ON t1.year = t0.year 
  

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

Комментарии:

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

2. проблема с t1. BookedBy = t0.BookedBy заключалось в том, что не у всех агентов есть резервирование в обеих таблицах

3. @bugz: t1.BookedBy = t0.BookedBy для ВНЕШНЕГО СОЕДИНЕНИЯ СЛЕВА не требуется, чтобы все агенты имели резервирование в обеих таблицах… только в ЛЕВОЙ таблице (следовательно, ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ). Возможно, вам нужно ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ? Это будет включать строки из обеих таблиц.