Получите те строки в MySql, чья цена продажи была изменена для определенного местоположения - PullRequest
1 голос
/ 18 июня 2019

У меня есть таблица с тысячами строк, из которых я хочу фильтровать по некоторым параметрам.Ниже упомянут мой запрос

SELECT product, selling_price, location FROM tablename ORDER BY product, location

Приведенный выше запрос возвращает указанные ниже данные

+--------------+----------------+----------------------+
| product      | selling_price  | location             |
+--------------+----------------+----------------------+
| Product A    | 1.00           | location 1           |
+--------------+----------------+----------------------+
| Product A    | 1.00           | location 1           |
+--------------+----------------+----------------------+
| Product B    | 1.00           | location 1           |
+--------------+----------------+----------------------+
| Product B    | 2.00           | location 1           |
+--------------+----------------+----------------------+
| Product C    | 1.00           | location 1           |
+--------------+----------------+----------------------+
| Product C    | 1.00           | location 1           |
+--------------+----------------+----------------------+
| Product C    | 2.00           | location 2           |
+--------------+----------------+----------------------+
| Product C    | 2.00           | location 2           |
+--------------+----------------+----------------------+
| Product D    | 3.00           | location 1           |
+--------------+----------------+----------------------+
| Product D    | 4.00           | location 1           |
+--------------+----------------+----------------------+
| Product D    | 4.00           | location 2           |
+--------------+----------------+----------------------+
| Product D    | 4.00           | location 2           |
+--------------+----------------+----------------------+

Я хочу отредактировать указанный выше запрос, чтобы получить приведенный ниже вывод.

+--------------+----------------+----------------------+
| product      | selling_price  | location             |
+--------------+----------------+----------------------+
| Product B    | 1.00           | location 1           |
+--------------+----------------+----------------------+
| Product B    | 2.00           | location 1           |
+--------------+----------------+----------------------+
| Product D    | 3.00           | location 1           |
+--------------+----------------+----------------------+
| Product D    | 4.00           | location 1           |
+--------------+----------------+----------------------+

т.е. в этом случае должны отображаться только те строки, цена которых была изменена для одного и того же местоположения. Цена Продукта B и Продукта D изменилась в конкретном местоположении.

Я пытался добавить HAVING COUNT(product) > 1, нозатем он возвращается только в строку.

this Отображать только те строки, чья SUM (цена) больше определенного числа предлагает добавить предложение HAVING, но оно применимо только к GROUP BY

Другая ссылка MYSQL-запрос - получить строки с измененной ценой очень близко к тому, что я хочу, что ответ не очень понятен.

Заранее спасибо.

Ответы [ 4 ]

4 голосов
/ 18 июня 2019

Самостоятельное объединение сделает:

SELECT DISTINCT
  t1.product, t1.selling_price, t1.location 
FROM tablename t1 INNER JOIN tablename t2
ON t1.product = t2.product AND t1.location = t2.location AND t1.selling_price <> t2.selling_price 
ORDER BY t1.product, t1.location, t1.selling_price

См. Демоверсию .
Результаты:

| product   | selling_price    | location   |
| --------- | ---------------- | ---------- |
| Product B | 1.00             | location 1 |
| Product B | 2.00             | location 1 |
| Product D | 3.00             | location 1 |
| Product D | 4.00             | location 1 |
1 голос
/ 18 июня 2019

Скорее всего, я бы пошел на

Запрос

SELECT 
 *
FROM 
 tablename
WHERE
 (product, location) IN (

  SELECT 
     product
   , location
  FROM 
   tablename 
  GROUP BY 
     product
   , location
  HAVING 
    MIN(selling_price) <> MAX(selling_price)

)
ORDER BY 
   product
 , location

Результат

| product   | selling_price | location   |
| --------- | ------------- | ---------- |
| Product B | 1             | location 1 |
| Product B | 2             | location 1 |
| Product D | 3             | location 1 |
| Product D | 4             | location 1 |

см. демо

1 голос
/ 18 июня 2019

Вы можете использовать EXISTS, который проверяет любую другую запись с тем же продуктом и местоположением, но с другой ценой.Используйте DISTINCT для устранения возможных дубликатов.

SELECT DISTINCT
       t1.product,
       t1.selling_price,
       t1.location
       FROM tablename t1
       WHERE EXISTS (SELECT *
                            FROM tablename t2
                            WHERE t2.procuct = t1.product
                                  AND t2.location = t1.location
                                  AND t2.selling_price <> t1.selling_price);
0 голосов
/ 18 июня 2019
SELECT 
    product, selling_price, location
FROM
    tablename
WHERE
    product IN (SELECT 
            t.product
        FROM
            tablename t
        GROUP BY t.product , t.location
        HAVING COUNT(*) > 1
            AND (SELECT 
                COUNT(*)
            FROM
                tablename t2
            WHERE
                t2.product = t.product
                    AND t2.location = t.location
            GROUP BY t2.selling_price) > 1)
ORDER BY product , location
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...