Как я могу получить group by с totalcost в Oracle SQL

#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;