2012-02-23 4 views
0

Я думал, что у меня это взломанное, но оно возвращается к множеству результатов. Я постараюсь объяснить это лучше.Максимальные значения из SQL-запроса

У меня есть таблица, в которой указан тип доставки (I.e. One Man Delivery, Two Man Delivery) для продуктов. Стоимость доставки зависит от продукта, и каждый продукт может иметь несколько типов доставки.

Если пользователь добавляет два товара в корзину, мне нужно отобразить самые дорогие варианты доставки из любого из продуктов в корзине.

EG.

Product 1 
id=2 
Delivery Type=One Man delivery 
Cost=**£30** 
id=2 
Delivery Type=Two Man delivery 
Cost=£40 

Product 2 
id=4 
Delivery Type=One Man delivery 
Cost=£40 
id=4 
Delivery Type=Two Man delivery 
Cost=**£60** 

The results should be; 

id=4 
Delivery Type=Two Man delivery 
Cost=**£60** 
id=2 
Delivery Type=One Man delivery 
Cost=**£30** 

мне нужно также получить uid таблицы. Это останавливает запрос на получение правильных результатов. Он вернет все типы доставки. Если я удалю uid, он отобразит правильные результаты. Кажется, он останавливает группу.

<cfquery name="getDeliveryType" datasource="#application.dsn#"> 
    SELECT txt_pdelopt_type, MAX(mon_pdelopt_actcost) AS myCost, uid_pdelopt 
    FROM dbo.tbl_product_deliveryopt 
    WHERE bit_pdelopt_active=<cfqueryparam cfsqltype="cf_sql_bit" value="yes"> 
    AND  uid_pdelopt_prodid IN (<cfqueryparam cfsqltype="cf_sql_integer" value="4,5" list="yes">) 
    GROUP BY txt_pdelopt_type, uid_pdelopt 
    ORDER BY myCost DESC 
</cfquery> 

Каков наилучший способ приблизиться к этому? Любая помощь приветствуется.

Я думаю, что я продал себе манекен! Если у меня есть два продукта с одинаковыми параметрами доставки и расходами, я получаю все возвращаемые типы доставки, так как ни одна из этих затрат не превышает каждого из них?

Сейчас уже поздно, и я смущаю себя, не говоря уже о вас, ребята, которые пытаются помочь!

Так что я не уверен, что я пытаюсь сделать, это добиться того, что мне нужно!

Давайте попробуем начать с самого начала;

Таблица: tbl_product_deliveryopt UID: uid_pdelopt Id продукта: uid_pdelopt_prodid
Тип поставки: txt_pdelopt_type
Стоимость: mon_pdelopt_actcost

Эта таблица содержит типы доставки, связанные с продуктом. Продукт uid: uid_products.

Каждый продукт может иметь несколько типов доставки, таких как доставка одного человека, доставка двух человек.

Для каждого типа доставки могут быть разные затраты в зависимости от размера продукта.

Если в корзину добавлено два продукта, сначала необходимо найти самую дорогую стоимость доставки, а затем отобразить самую высокую стоимость, которую мы нашли вместе с другими опционами, которые разделяют uid_pdelopt_prodid самой высокой стоимости, которую мы нашли.

EG:

Продукт 1
Del Тип: One Man
Стоимость: £ 20
ProdID: 3

Продукт 1
Del Тип: Two Man
Стоимость: £ 40
ProdID: 3

Продукт 2
Del Тип: One Man
Стоимость: £ 10
ProdID: 4

Продукт 2
Del Тип: Two Man
Стоимость: £ 20
ProdID: 4

Поскольку продукт 1 имеет максимальная плата за доставку Мне нужно отобразить стоимость доставки продукта 1.

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

Другими словами, я не могу отобразить смесь вариантов, которые они должны связывать uid_pdelopt_prodid.

Это объясняет это лучше?

+1

Требование не совсем ясно для меня - можете ли вы упростить свой пример? например выборки данных и желаемых результатов. Кроме того, это связано с проблемой охлаждения? – ninesided

+1

Не могли бы вы разместить таблицу ddl? Имена столбцов являются битовыми. Неясно, какие идентификаторы относятся к жесткому кодированному списку: '4,5'. Кроме того, всегда полезно включать ваш тип базы данных с вопросами sql. – Leigh

ответ

0

Получение UID ломает GROUP BY, потому что это уникальный и если вы группы по уникальному полю, каждый строка попадает в собственную группу.

Я не уверен на 100% о вашей структуре таблицы, а какие поля означают и т. Д., Но как насчет чего-то подобного?

SELECT pdo.uid_pdelopt, pdo.txt_pdelopt_type, pdo.mon_pdelopt_actcost 
FROM dbo.tbl_product_deliveryopt pdo 
     INNER JOIN (
        SELECT txt_pdelopt_type 
          , uid_pdelopt_prodid 
          , MAX(mon_pdelopt_actcost) AS max_cost 
        FROM dbo.tbl_product_deliveryopt 
        WHERE bit_pdelopt_active = <cfqueryparam cfsqltype="cf_sql_bit" value="yes"> 
        AND  uid_pdelopt_prodid IN 
          (
           <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.uid_pdelopt_prodid#" list="yes"> 
          ) 
        GROUP BY txt_pdelopt_type, uid_pdelopt_prodid 
     ) 
      pdo_max ON (pdo_max.txt_pdelopt_type = pdo.txt_pdelopt_type 
        AND pdo_max.max_cost = pdo.mon_pdelopt_actcost 
        AND pdo_max.uid_pdelopt_prodid = pdo.uid_pdelopt_prodid) 

WHERE pdo.bit_pdelopt_active = <cfqueryparam cfsqltype="cf_sql_bit" value="yes"> 
AND  pdo.uid_pdelopt_prodid IN 
      (
       <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.uid_pdelopt_prodid#" list="yes"> 
      ) 

ORDER BY pdo.mon_pdelopt_actcost DESC 

Вид рядный (внутренний запрос) возвращает самую высокую цену за uid_pdelopt_prodid и txt_pdelopt_type. Затем вы присоединяетесь к ней обратно в исходную таблицу, чтобы отфильтровать только до тех строк, которые имеют такую ​​максимальную стоимость. Позволяет вам отменить также uid_pdelopt.

+0

Hi Ninesided, спасибо за это, теперь он работает правильно. Просто быстрый вопрос, если мне нужно убедиться, что типы доставки связаны с идентификатором продукта, т. Е. Будут отображаться только типы доставки, которые являются самыми дорогими, и оба варианта «uid_pdelopt_prodid» будут возможны?Еще раз большое спасибо за вашу помощь !! –

+0

@JasonCongerton - Извините, я не уверен, что понимаю (снова!), Можете ли вы добавить блок ** EDIT ** к исходному вопросу с примером того, что вы имеете в виду? – ninesided

+0

@Leigh - что вы сделали по моему запросу ?! Я не могу прочитать это сейчас! Спасибо за исправление моей опечатки, хотя :-) – ninesided

0

Вам необходимо сгруппировать и суммировать стоимость, чтобы получить общую стоимость каждой ситуации. Тогда порядок по сумме. Первая строка будет самой большой.

Другим вариантом является использование предложения «having», позволяющего выполнять условия для агрегатов, таких как сумма.

Вы сказали бы ... Группа по х Имея сумма (у) = тах (у)

Смежные вопросы