#sql-server #join #minimum
#sql-сервер #Присоединиться #минимальная
Вопрос:
Я использую SQL Server 2008 и мне нужно проверить минимальную цену для каждого заказанного продукта. (2, 11, 15 — это supplerid
)
Это запрос:
SELECT
od.IDPRODUCTO,
p.NOMBRE AS DescProd,
t.MIN_PRICE,
t.IDLIBRERIA,
FECHAACTUALIZACION
FROM
ORDERDETAILS od
JOIN
(SELECT
rpl.IDPRODUCTO,
MIN(PRECIO) AS min_price,
rpl.IDLIBRERIA AS idlibreria
FROM
RELPRODUCTOLIBRERIAS rpl
GROUP BY
rpl.IDPRODUCTO, rpl.IDLIBRERIA) t ON t.IDPRODUCTO = Od.IDPRODUCTO
JOIN
PRODUCTOS p ON (od.IDPRODUCTO = p.ID)
LEFT JOIN
EDITORIALES e ON (p.IDEDITORIAL = e.ID)
LEFT JOIN
ORDERSTATUSFOLLOWUP osf ON osf.ID = Od.IDSTATUSFOLLOWUP
WHERE
IDORDER = 98770
ВОЗВРАТ:
╔════════╦═══════════════════════╦════════╦════╦════════════╗
║ 153389 ║ CONCIENCIA- SOCIALES ║ 165.00 ║ 11 ║ 2014-06-27 ║
║ 153389 ║ CONCIENCIA - SOCIALES ║ 165.00 ║ 15 ║ 2014-06-27 ║
║ 136892 ║ CUENTEME DON SEGUNDO ║ 70.00 ║ 2 ║ 2014-06-27 ║
║ 136892 ║ CUENTEME DON SEGUNDO ║ 50.00 ║ 11 ║ 2014-06-27 ║
║ 136892 ║ CUENTEME DON SEGUNDO ║ 70.00 ║ 15 ║ 2014-06-27 ║
╚════════╩═══════════════════════╩════════╩════╩════════════╝
Мне нужен этот результат:
╔════════╦═══════════════════════╦════════╦════╦════════════╗
║ 153389 ║ CONCIENCIA - SOCIALES ║ 165.00 ║ 11 ║ 2014-06-27 ║
║ 136892 ║ CUENTEME DON SEGUNDO ║ 50.00 ║ 11 ║ 2014-06-27 ║
╚════════╩═══════════════════════╩════════╩════╩════════════╝
Что необходимо изменить?
Спасибо
Комментарии:
1. Если вы включите некоторые примеры данных, вам будет легче понять проблему и легче показать вам решения.
2. вы имеете в виду исходные таблицы под образцами данных?
3. Это или что-то близкое к этому, что даст нам представление о том, с чем вы имеете дело
4. RELPRODUCTOLIBRERIAS имеет идентификатор поставщика, идентификатор продукта, цену поставщика. В PRODUCTOS есть products / books ..идентификатор, название. ORDERS содержит общую информацию для заказа. В ORDERDETAILS содержится подробная информация из заказа. Пожалуйста, игнорируйте другие таблицы. Итак, предположим, что идентификатор заказа 100 содержит 2 купленные книги, поэтому в orderdetails вы найдете 2 строки. Я беру одну из этих строк, idproduct … и хочу предложить ЛУЧШУЮ ЦЕНУ из таблиц RELPRODUCTOLIBRERIAS (цена поставщика) и idlibreria (идентификатор из книжного магазина). Итак, я знаю, в каком книжном магазине есть эта книга по лучшей цене. то же самое для следующего продукта..
5. в моем примере получается 165 долларов, я не возражаю, если это принесет 11 или 15 идентификаторов книжного магазина, поскольку оба стоят 165 долларов …. но во втором результате мне нужна idlibreria (идентификатор книжного магазина) 11, поскольку в этом книжном магазине книга стоит 50 долларов (лучшая цена)
Ответ №1:
Попробуйте выбрать минимальную цену и идентификатор поставщика:
SELECT od.IDProducto ,
p.Nombre AS DescProd ,
MIN(t.min_price) ,
MIN(t.idlibreria) ,
FechaActualizacion
FROM orderdetails od
JOIN ( SELECT rpl.idproducto ,
MIN(precio) AS min_price ,
rpl.idlibreria AS idlibreria
FROM RelProductoLibrerias rpl
GROUP BY rpl.idproducto ,
rpl.idlibreria
) t ON t.idproducto = Od.IDProducto
JOIN Productos p ON ( od.IDProducto = p.ID )
LEFT JOIN Editoriales e ON ( p.IdEditorial = e.Id )
LEFT JOIN OrderStatusFollowUp osf ON osf.ID = Od.IDStatusFollowUp
WHERE IDOrder = 98770
GROUP BY od.IDProducto,
p.Nombre,
FechaActualizacion
Комментарии:
1. это смешивает idlibreria с минимальной ценой…. он возвращает 50 долларов, но вместо 11 возвращает idlibreria 2, что соответствует 50 долларам… это потому, что вы используете min (idlibreria) … итак, это не работает, спасибо за вашу помощь, не могли бы вы любезно помочь дальше? Спасибо!
2. Единственный способ — добавить второй или подвыборку, чтобы получить правильную idlibreria.
Ответ №2:
SELECT DISTINCT(od.IDProducto) , p.Nombre as DescProd,
t.min_price,t.idlibreria,FechaActualizacion
from orderdetails od
join (select rpl.idproducto,min(precio) as min_price,rpl.idlibreria as idlibreria
from RelProductoLibrerias rpl
group by rpl.idproducto ,rpl.idlibreria
) t
on t.idproducto = Od.IDProducto
JOIN Productos p ON (od.IDProducto = p.ID)
LEFT JOIN Editoriales e ON (p.IdEditorial=e.Id)
LEFT JOIN OrderStatusFollowUp osf on osf.ID = Od.IDStatusFollowUp WHERE IDOrder=98770
ORDER BY t.min_price
Комментарии:
1. это возвращает все 5 результатов