Выбор MAX () для группы не возвращает соответствующие столбцы - PullRequest
1 голос
/ 31 октября 2019

Я использую Пример базы данных MySQL Tutorial .

Мне нужно найти продавца с худшими продажами (самые низкие venta_por_empleado) и лучшими продажами (самые высокие venta_por_empleado)) за каждый semestre и city. Используя временных таблиц, я получаю следующий набор результатов (tbl_ventas_ciudad_semestre, временная таблица):

| salesRepEmployeeNumber | Nombre_Empleado  | city          | venta_por_empleado | officeCode | orden_year | semestre | periodo |
|------------------------|------------------|---------------|--------------------|------------|------------|----------|---------|
| 1504                   | Barry Jones      | London        | 6719               | 7          | 2019       | 1        | 2019-1  |
| 1286                   | Foon Yue Tseng   | NYC           | 5016               | 3          | 2019       | 1        | 2019-1  |
| 1323                   | George Vanauf    | NYC           | 6372               | 3          | 2019       | 1        | 2019-1  |
| 1702                   | Martin Gerard    | Paris         | 4180               | 4          | 2019       | 1        | 2019-1  |
| 1401                   | Pamela Castillo  | Paris         | 8464               | 4          | 2019       | 1        | 2019-1  |
| 1370                   | Gerard Hernandez | Paris         | 12021              | 4          | 2019       | 1        | 2019-1  |
| 1166                   | Leslie Thompson  | San Francisco | 3587               | 1          | 2019       | 1        | 2019-1  |
| 1165                   | Leslie Jennings  | San Francisco | 11208              | 1          | 2019       | 1        | 2019-1  |
| 1611                   | Andy Fixter      | Sydney        | 5550               | 6          | 2019       | 1        | 2019-1  |
| 1621                   | Mami Nishi       | Tokyo         | 4923               | 5          | 2019       | 1        | 2019-1  |
| 1501                   | Larry Bott       | London        | 7776               | 7          | 2019       | 2        | 2019-2  |
| 1337                   | Loui Bondur      | Paris         | 6186               | 4          | 2019       | 2        | 2019-2  |
| 1188                   | Julie Firrelli   | Boston        | 4227               | 2          | 2020       | 1        | 2020-1  |
| 1612                   | Peter Marsh      | Sydney        | 6036               | 6          | 2020       | 1        | 2020-1  |
| 1216                   | Steve Patterson  | Boston        | 4876               | 2          | 2020       | 2        | 2020-2  |

Чтобы найти продавца с наихудшими продажами, я бы применил MIN(venta_por_empleado)в таблицу:

SELECT 
    Nombre_Empleado,
    city,
    MIN(venta_por_empleado) as venta_por_empleado,
    orden_year,
    semestre,
    periodo
FROM tbl_ventas_ciudad_semestre
GROUP BY
    city, periodo
ORDER BY
    periodo ASC, venta_por_empleado DESC;

Результат:

| Nombre_Empleado | city          | venta_por_empleado | orden_year | semestre | periodo |
|-----------------|---------------|--------------------|------------|----------|---------|
| Barry Jones     | London        | 6719               | 2019       | 1        | 2019-1  |
| Foon Yue Tseng  | NYC           | 5016               | 2019       | 1        | 2019-1  |
| Martin Gerard   | Paris         | 4180               | 2019       | 1        | 2019-1  |
| Leslie Thompson | San Francisco | 3587               | 2019       | 1        | 2019-1  |
| Andy Fixter     | Sydney        | 5550               | 2019       | 1        | 2019-1  |
| Mami Nishi      | Tokyo         | 4923               | 2019       | 1        | 2019-1  |
| Larry Bott      | London        | 7776               | 2019       | 2        | 2019-2  |
| Loui Bondur     | Paris         | 6186               | 2019       | 2        | 2019-2  |
| Julie Firrelli  | Boston        | 4227               | 2020       | 1        | 2020-1  |
| Peter Marsh     | Sydney        | 6036               | 2020       | 1        | 2020-1  |
| Steve Patterson | Boston        | 4876               | 2020       | 2        | 2020-2  |

Чтобы найти продавца с лучшими продажами, я бы применил MAX(venta_por_empleado) в таблицу:

SELECT 
    Nombre_Empleado,
    city,
    MAX(venta_por_empleado) as venta_por_empleado,
    orden_year,
    semestre,
    periodo
FROM tbl_ventas_ciudad_semestre
GROUP BY
    city, periodo
ORDER BY
    periodo ASC, venta_por_empleado DESC;
| Nombre_Empleado | city          | venta_por_empleado | orden_year | semestre | periodo |
|-----------------|---------------|--------------------|------------|----------|---------|
| Barry Jones     | London        | 6719               | 2019       | 1        | 2019-1  |
| Foon Yue Tseng  | NYC           | 6372               | 2019       | 1        | 2019-1  |
| Martin Gerard   | Paris         | 12021              | 2019       | 1        | 2019-1  |
| Leslie Thompson | San Francisco | 11208              | 2019       | 1        | 2019-1  |
| Andy Fixter     | Sydney        | 5550               | 2019       | 1        | 2019-1  |
| Mami Nishi      | Tokyo         | 4923               | 2019       | 1        | 2019-1  |
| Larry Bott      | London        | 7776               | 2019       | 2        | 2019-2  |
| Loui Bondur     | Paris         | 6186               | 2019       | 2        | 2019-2  |
| Julie Firrelli  | Boston        | 4227               | 2020       | 1        | 2020-1  |
| Peter Marsh     | Sydney        | 6036               | 2020       | 1        | 2020-1  |
| Steve Patterson | Boston        | 4876               | 2020       | 2        | 2020-2  |

Используя MIN () и MAX (), он возвращает правильные значения для номеров продаж, но имена торговых представителей, связанных с этим номером продаж, не совпадают.

Как получитьправильное имя для правильного номера продаж?

Ответы [ 2 ]

0 голосов
/ 31 октября 2019

Учитывая ограничение, что каждая таблица временная, мне нужно создать новую временную таблицу для копирования содержимого из tbl_ventas_ciudad_semestre, как подсказал Тим.

DROP TEMPORARY TABLE IF EXISTS tbl_ventas_ciudad_semestre_2;
CREATE TEMPORARY TABLE tbl_ventas_ciudad_semestre_2
    SELECT * FROM tbl_ventas_ciudad_semestre;

Тогда можно получить правильный MIN иMAX первой таблицы с использованием подзапроса

/* MIN or worst sales*/
    SELECT * FROM tbl_ventas_ciudad_semestre a WHERE
    a.venta_por_empleado IN 
    (
    SELECT MIN(b.venta_por_empleado) FROM tbl_ventas_ciudad_semestre_2 b
    GROUP BY periodo, city
    );
/* MAX or best sales*/
    SELECT * FROM tbl_ventas_ciudad_semestre a WHERE
    a.venta_por_empleado IN 
    (
    SELECT MAX(b.venta_por_empleado) FROM tbl_ventas_ciudad_semestre_2 b
    GROUP BY periodo, city
    )
0 голосов
/ 31 октября 2019

Вот версия, которая может как соответствовать вашим требованиям (более или менее), так и работать, учитывая, что tbl_ventas_ciudad_semestre - временная таблица. Мы можем присоединить вашу таблицу к подзапросу, который находит минимальные и максимальные показатели продаж для каждого семестра и города:

SELECT
    t1.salesRepEmployeeNumber,
    t1.Nombre_Empleado,
    t1.city,
    t1.venta_por_empleado,
    t1.officeCode,
    t1.orden_year,
    t1.semestre,
    t1.periodo
FROM tbl_ventas_ciudad_semestre t1
INNER JOIN
(
    SELECT
        city,
        semestre,
        MIN(venta_por_empleado) AS min_venta_por_empleado,
        MAX(venta_por_empleado) AS max_venta_por_empleado
    FROM tbl_ventas_ciudad_semestre
    GROUP BY
        city,
        semestre
) t2
    ON t1.city = t2.city AND
       t1.semestre = t2.semestre AND
       t1.venta_por_empleado IN (t2.min_venta_por_empleado, t2.max_venta_por_empleado)
ORDER BY
    t1.semestre,
    t1.periodo,
    t1.venta_por_empleado;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...