Нахождение значений Max () по внешнему ключу - PullRequest
0 голосов
/ 30 ноября 2011

Рассмотрим эту структуру базы данных:

 __________                 __________
| Trucks   |               | Mileage  |
|__________|__________     |__________|________________________
| ID    | DRIVER      |    | TRUCK_ID  | MILEAGE  | OIL_CHANGE |
|---------------------|    |-----------------------------------|
| 1     | Tony        |    | 1         | 100000     105000     |
| 2     | George      |    | 2         | 6020       10020      |
| 3     | Mary        |    | 3         | 37798      41000      |
|_____________________|    | 3         | 41233      47200      |
                           | 3         | 49000                 |
                           |___________________________________|

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

_________________________________
| 1  | Tony  |  100000 | 105000 |
| 2  | George|  6020   | 10020  |
| 3  | Mary  |  49000  | 47200  |
|_______________________________|

Это то, что я пробовал до сих пор:

SELECT t.*, MAX(m.mileage) AS mileage, MAX(m.oil_change) AS oil_change
FROM trucks t
LEFT JOIN mileage m ON t.id = m.truck_id
GROUP BY t.id

Но это, похоже, не позволяет функции MAX работать правильно.Он не всегда содержит фактическое максимальное значение для mileage

Ответы [ 2 ]

6 голосов
/ 30 ноября 2011

Понял! Ваш столбец миль должен быть определен как тип символа, а не числовой тип! Когда это происходит, порядок выполняется в алфавитном порядке, а не по значению.

Вам следует преобразовать столбцы mileage и oil_change в числовой тип (я рекомендую INT на основе предоставленной выборки данных).

Пока вы не конвертируете их, это будет работать:

SELECT t.*, MAX(cast(m.mileage as int)) AS mileage, 
            MAX(cast(m.oil_change as int)) AS oil_change
FROM trucks t
LEFT JOIN mileage m ON t.id = m.truck_id
GROUP BY t.id
0 голосов
/ 30 ноября 2011

Следующие запросы должны работать для вашего вопроса.

SELECT T.DRIVER,MIN(MILEAGE) AS MIN_MILEAGE,MIN(OIL_CHANGE) AS MIN_OIL_CHANGE
FROM TRUCKS T INNER JOIN MILEAGE M
ON T.ID = M.TRUCK_ID
GROUP BY T.DRIVER;


SELECT T.DRIVER,MAX(MILEAGE) AS MAX_MILEAGE,MAX(OIL_CHANGE) AS MAX_OIL_CHANGE
FROM TRUCKS T INNER JOIN MILEAGE M
ON T.ID = M.TRUCK_ID
GROUP BY T.DRIVER;

С уважением Venk

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