#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
для ВНЕШНЕГО СОЕДИНЕНИЯ СЛЕВА не требуется, чтобы все агенты имели резервирование в обеих таблицах… только в ЛЕВОЙ таблице (следовательно, ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ). Возможно, вам нужно ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ? Это будет включать строки из обеих таблиц.