Запрос на основе 2 таблиц, в которых рассчитываются суммы дубликатов идентификаторов.

0

У меня есть 2 таблицы, таблица ONE состоит из category_id где каждый имеет свой собственный уникальный атрибут name и каждый product_id будет уникальным в этой таблице без дубликатов.

Таблица TWO состоит из уникального product_id как и таблица ONE, и rank основанный на наибольшей amount.

Таблица: ОДИН

  +--------+---------+------------+--------+
  | brd_id | cat_id  | product_id |  name  |
  +--------+---------+------------+--------+
  |      1 |       1 | 333        |    w   |
  |      2 |       1 | 444        |    w   |
  |      3 |       1 | 555        |    w   |
  |      4 |       2 | 666        |    y   |
  |      5 |       2 | 777        |    y   |
  |      6 |       3 | 888        |    t   |
  +--------+---------+------------+--------+

Таблица: ДВА

  +--------+---------+------------+--------+--------+
  | new_id |  type   | product_id |  rank  | amount |
  +--------+---------+------------+--------+--------+
  |      1 |    all  | 333        |    1   |    80  |
  |      2 |    all  | 444        |    2   |    70  |
  |      3 |    all  | 555        |    3   |    60  |
  |      4 |    all  | 666        |    4   |    50  |
  |      5 |    all  | 777        |    5   |    40  |
  |      6 |    all  | 888        |    6   |    30  |
  +--------+---------+------------+--------+--------+

То, что я хочу, - показать name из таблицы ONE только один раз на основе суммы из таблицы TWO WHERE в таблице. ONE product_id имеет тот же cat_id.

Этому я смог достичь, используя этот запрос, в основном прямо из базы данных, поэтому поля различаются:

SELECT DISTINCT  'cat'.'brand_name'
FROM 'ps_product_brand' AS 'cat'
INNER JOIN 'ps_product_custom_statistics_weekly' AS 'cat_p' 
ON 'cat_p'.'id_product' = 'cat'.'id_product'
WHERE 'cat_p'.'type' LIKE '%all%'
AND 'cat_p'.'rank' <= 16
ORDER BY 'cat_p'.'rank' ASC

ПРОБЛЕМА

Я получаю дубликаты имен, поэтому я использовал DISTINCT который в конце игнорирует повторяющиеся значения.

Я хочу рассчитать amount которой product_id из таблицы ONE является таблицей IN TWO AND, где у них одинаковая category_id в таблице ONE.

ОЖИДАЕМЫЙ ВЫХОД

  +---------+--------+
  | cat_id  |  name  |   amount
  +---------+--------+
  |       1 |    w   |    210
  |       2 |    y   |     90
  |       3 |    t   |     30
  +--------+---------+

Надеюсь, это имеет смысл. СПАСИБО

Теги:
database

2 ответа

1
Лучший ответ

Попробуйте следующее:

SELECT 'cat'.'brand_name', 'cat_p'.'amount', SUM('cat_p'.'amount') AS 'sum_amount'
FROM 'ps_product_brand' AS 'cat'
INNER JOIN 'ps_product_custom_statistics_weekly' AS 'cat_p' ON 'cat_p'.'id_product' = 'cat'.'id_product'
WHERE 'cat_p'.'type' LIKE '%all%' AND 'cat_p'.'rank' <= 16
GROUP BY 'cat'.'brand_name'
ORDER BY 'sum_amount' DESC, 'cat'.'brand_name'

Обратите внимание на разницу в количествах между суммой и sum_amount, где находятся дубликаты. Возможно, вам придется увеличить ранг и, возможно, добавить LIMIT до конца.

  • 0
    Спасибо, именно то, что я искал!
1

У меня нет скрипки для работы, но я думаю, что это правильно.

Это МОЖЕТ иметь опечатки.

Общая идея заключается в том, что мы делаем это в первую очередь. Затем, как только мы получим отдельный, мы получим SUM из отдельных элементов из вторичной таблицы. Причина, по которой мы это делаем, заключается в том, что в противном случае SUM (если это делается внутри) объединит несколько записей и получит слишком высокую сумму.

SELECT A.CAT_ID, A.BRAND_NAME,
(SELECT SUM(AMOUNT) FROM ps_product_custom_statistics_weekly P WHERE P.ID_PRODUCT=A.ID_PRODUCT) FROM
(
SELECT DISTINCT  'cat'.'cat_id', 'cat'.'brand_name', 'cat_p'.'rank'
FROM 'ps_product_brand' AS 'cat'
INNER JOIN 'ps_product_custom_statistics_weekly' AS 'cat_p' 
ON 'cat_p'.'id_product' = 'cat'.'id_product'
WHERE 'cat_p'.'type' LIKE '%all%'
AND 'cat_p'.'rank' <= 16
GROUP BY  'cat'.'cat_id', 'cat'.'brand_name'
) A
ORDER BY A.RANK
  • 0
    Хороший человек, спасибо, что помог мне попробовать и сообщить, не беспокойтесь об опечатках, я просто хочу идею решения моей проблемы.

Ещё вопросы

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