ИСПОЛЬЗОВАНИЕ СЛУЧАЯ ДЛЯ ИЗМЕНЕНИЯ НАИМЕНОВАНИЯ ПРОДУКТА - PullRequest
0 голосов
/ 04 ноября 2019

Я работаю с такой таблицей:

+-------+-------------+-----------+--+--+
| BRAND | PRODUCTNAME | UNITPRICE |  |  |
+-------+-------------+-----------+--+--+
| A     | APEN        |        10 |  |  |
| A     | APENCIL     |        12 |  |  |
| B     | AAPEN       |        15 |  |  |
| B     | AAPENCIL    |         9 |  |  |
| A     | APAPER      |         2 |  |  |
+-------+-------------+-----------+--+--+

И мне нужно найти лучшую цену для каждого продукта.

Я думаю, что мне нужно использовать CASE и подстроку дляотрежьте «A» и «AA» перед названием продукта, чтобы проверить лучшую цену для того же продукта. Я новичок в этом, и я не могу понять, почему это не работает.

Тогда мне просто нужно использовать Min (Prodname) ??

BRAND
,CASE BRAND
        when 'A' then Substring(REPLACE(REPLACE(PRODUCTNAME, ' ', ''), '  ', ''),2,22) Prodname
        when 'B' then Substring(REPLACE(REPLACE(PRODUCTNAME, ' ', ''), '  ', ''),3,33) Prodname,
        ELSE 'not known'
        END AS BRANDNAME
,UnitPrice

Что мне нужно получитьс этим это что-то вроде:

╔═══════╦═════════════╦═══════════╗
║ BRAND ║ PRODUCTNAME ║ UNITPRICE ║
╠═══════╬═════════════╬═══════════╣
║ A     ║ PEN         ║        10 ║
║ B     ║ AAPENCIL    ║         9 ║
║ A     ║ PAPER       ║         2 ║
╚═══════╩═════════════╩═══════════╝

Спасибо

Ответы [ 2 ]

0 голосов
/ 04 ноября 2019

Вы можете использовать функцию TRIM() как TRIM(LEADING 'A' FROM PRODUCTNAME), чтобы избавиться от ведущих A s:

SELECT T1.BRAND, T2.*
  FROM TAB T1
  JOIN (
        SELECT TRIM(LEADING 'A' FROM PRODUCTNAME) AS PRODUCT_NAME,
               MIN(UNITPRICE) AS UNITPRICE
          FROM TAB
         GROUP BY PRODUCT_NAME) T2 
     ON TRIM(LEADING 'A' FROM T1.PRODUCTNAME) = T2.PRODUCT_NAME
       AND T1.UNITPRICE = T2.UNITPRICE
  ORDER BY T1.UNITPRICE DESC;

Демо

0 голосов
/ 04 ноября 2019

Используя REGEXP_REPLACE и MySQL 8+, мы можем попробовать:

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY REGEXP_REPLACE(PRODUCTNAME, '^A+', '') ORDER BY UNITPRICE) rn
    FROM yourTable
)

SELECT
    BRAND,
    REGEXP_REPLACE(PRODUCTNAME, '^A+', '') AS PRODUCTNAME,
    UNITPRICE
FROM cte
WHERE rn = 1
ORDER BY UNITPRICE DESC;

screen capture of demo below

Демо

Стратегия этого запроса состоит в том, чтобы заменить регулярное выражение ^A+ пустой строкой, чтобы отделить начальные символы A от каждого названия продукта. Это открывает потенциально неприятный крайний случай для продуктов, которые могут законно начинаться с капитала A. Игнорирование этого, однако, моя логика должна выдержать здесь.

...