У меня есть несколько сложный оператор SQL, но я не знаю, куда поместить предложение WHERE

0

Я не знаю, куда поместить предложение 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
  • 0
    Я полагаю, вы могли бы передать суть проблемы в более простом запросе.
  • 0
    Если столбцы для фильтрации находятся в соединенных таблицах, поместите условие в предложение ON (в отличие от WHERE ). Например, LEFT JOIN (SELECT ... FROM driverstops ... ) stops ON dr.id = stops.driverid AND delivdate BETWEEN ...
Показать ещё 3 комментария
Теги:

1 ответ

0

Что касается проблем, то столбцы, которые вы хотите фильтровать приходят из агрегированных подзапросов, которые затем 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
  • 0
    Это сработало. Спасибо за помощь.
  • 0
    @ Брайан: добро пожаловать! Если мой ответ решил вашу проблему, пожалуйста, примите ее , нажав зеленую галочку ... Спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню