Я не знаю, куда поместить предложение WHERE. В таблице драйверов есть поле с именем delivdate, а в журнале повреждений таблицы - поле dateofdelivery. Я хочу указать конкретные диапазоны дат. Где я могу поместить предложение WHERE, чтобы ограничить данные?
SELECT
dr.drivername,
sumStops,
perfectcnt/sumStops * 100 AS perfpcnt,
qualcnt/sumStops * 100 AS qualpcnt,
compcnt/sumStops * 100 As comppcnt,
damacnt/sumStops * 100 AS damapcnt,
nofitcnt/sumStops * 100 AS nofitpcnt,
incocnt/sumStops * 100 AS incopcnt,
misscnt/sumStops * 100 AS misspcnt,
notlcnt/sumStops * 100 AS notlpcnt,
noupcnt/sumStops * 100 AS nouppcnt,
failccnt/sumStops * 100 AS failcpcnt,
failscnt/sumStops * 100 AS failspcnt,
conccnt/sumStops * 100 AS concpcnt,
nocodcnt/sumStops * 100 AS nocodpcnt,
failicnt/sumStops * 100 AS failipcnt
FROM drivers dr
LEFT JOIN (
SELECT
driverid,
SUM(numberofstops) sumStops
FROM driverstops
GROUP BY driverid
) stops ON dr.id = stops.driverid
LEFT JOIN (
SELECT
driverid,
damagelog.dateofdelivery date,
SUM(perfect) perfectcnt,
SUM(quality) qualcnt,
SUM(compliment) compcnt,
SUM(damage) damacnt,
SUM(nofit) nofitcnt,
SUM(incomplete) incocnt,
SUM(misseddeliv) misscnt,
SUM(notloaded) notlcnt,
SUM(noupdate) noupcnt,
SUM(failcall) failccnt,
SUM(failsendemail) failscnt,
SUM(concerns) conccnt,
SUM(nocod) nocodcnt,
SUM(failinst) failicnt
FROM damagelog
GROUP BY driverid
) dam ON dr.id = dam.driverid
Что касается проблем, то столбцы, которые вы хотите фильтровать приходят из агрегированных подзапросов, которые затем JOIN
под ред. Существует одно объединение (driverstops
), в котором поле, по которому вы хотите выполнить фильтрацию, не возвращается подзапросом.
Кажется, что самое простое решение - поместить предложение WHERE
в каждый подзапрос, например:
LEFT JOIN (
SELECT driverid,SUM(numberofstops) sumStops
FROM driverstops
WHERE delivdate BETWEEN @stat_date AND @end_date
GROUP BY driverid
) stops ON dr.id = stops.driverid
А также:
LEFT JOIN (
SELECT
driverid,
damagelog.dateofdelivery date,
SUM(perfect) perfectcnt,
...
FROM damagelog
WHERE dateofdelivery BETWEEN @stat_date AND @end_date
GROUP BY driverid
) dam ON dr.id = dam.driverid
ON
(в отличие отWHERE
). Например,LEFT JOIN (SELECT ... FROM driverstops ... ) stops ON dr.id = stops.driverid AND delivdate BETWEEN ...