#sql #oracle
#sql #Oracle
Вопрос:
У меня есть две таблицы в Oracle. Одно имя orders_new
— это таблица, содержащая названия продуктов, включенных в заказ на дату:
---------- --------------------- -----------
| ORDER_ID | PRODUCTSPURCHASED | ORDERDATE |
---------- --------------------- -----------
| 1001 | rice,sugar,facewash | 20-AUG-20 |
| 1002 | sanitizer,handwash | 21-JUL-20 |
| 1003 | dal | 01-MAY-20 |
| 1004 | facewash,handwash | 22-AUG-20 |
| 1005 | sugar,facemask | 0 |
---------- --------------------- -----------
и, кроме того, у меня есть другая таблица с именем products_new
— цены на товары по месяцам:
------------- -------------- -------
| PRODUCTNAME | PRODUCTPRICE | MONTH |
------------- -------------- -------
| rice | 100 | jul |
| rice | 110 | aug |
| sugar | 40 | feb |
| sugar | 50 | apr |
| sugar | 60 | aug |
| facewash | 110 | jul |
| facewash | 100 | aug |
| sanitizer | 200 | jul |
| sanitizer | 190 | aug |
| handwash | 50 | jul |
| handwash | 100 | aug |
| dal | 40 | may |
| dal | 45 | jun |
| dal | 50 | jul |
| dal | 55 | aug |
| facemask | 15 | feb |
| facemask | 20 | jul |
| facemask | 25 | aug |
------------- -------------- -------
Я хочу, чтобы выходная таблица была сгруппирована с помощью order_id
with totalcost
.
Как я могу это получить?
Комментарии:
1. Вы действительно сохраняете
products_new(months)
в виде 3 символов или у вас реальныйdate
тип данных?
Ответ №1:
Не совсем уверен, но вы могли бы попробовать это:
SELECT order_id, sum(productprice) AS totalcost
FROM products_new
LEFT JOIN orders_new
ON productname IN productspurchased AND month = DATEPART(month, orderdate)
GROUP BY order_id
Хотя месяц, вероятно, также следует сохранить как тип ДАТЫ.
Не уверен, что это работает так.
Ответ №2:
Исправьте свою модель данных! Хранение нескольких значений в одном столбце — плохая, очень, очень плохая идея.
Но иногда мы сталкиваемся с действительно плохими моделями данных других людей. Если это так, вы можете использовать логику, подобную этой:
select o.order_id, sum(p.price)
from orders_new o left jion
products_new p
on ',' || replace(o.PRODUCTSPURCHASED, ', ', ',') || ',' like '%,' || p.productname || ',%'
Обратите внимание, что это решает как проблему наличия разделителей, так и тот факт, что разделители несовместимы (как запятые, так и пробел через запятую).
Однако вам следует приложить усилия для исправления модели данных, создав таблицу соединений / ассоциаций с одной строкой для каждого заказа / комбинации продуктов.
group by o.order_id;