Минимальная цена SQL при объединении нескольких таблиц

#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.00112014-06-27 ║
║ 153389 ║ CONCIENCIA - SOCIALES ║ 165.00152014-06-27 ║
║ 136892 ║ CUENTEME DON SEGUNDO  ║ 70.0022014-06-27 ║
║ 136892 ║ CUENTEME DON SEGUNDO  ║ 50.00112014-06-27 ║
║ 136892 ║ CUENTEME DON SEGUNDO  ║ 70.00152014-06-27 ║
╚════════╩═══════════════════════╩════════╩════╩════════════╝
  

Мне нужен этот результат:

 ╔════════╦═══════════════════════╦════════╦════╦════════════╗
║ 153389 ║ CONCIENCIA - SOCIALES ║ 165.00112014-06-27 ║
║ 136892 ║ CUENTEME DON SEGUNDO  ║ 50.00112014-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 результатов