SQL查询的最大值

时间:2012-02-23 23:32:10

标签: sql

我以为我破了这个但是它返回了许多结果。我会尝试更好地解释这一点。

我有一张表格,其中包含产品的交货类型(即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 产品编号:uid_pdelopt_prodid
交货类型:txt_pdelopt_type
费用:mon_pdelopt_actcost

此表包含与产品相关的交付类型。产品uid为uid_products

每种产品都有多种交付方式,例如One Man Delivery,Two Man Delivery。

每种交付类型可能会有不同的成本,具体取决于产品的大小。

如果购物车中添加了两个产品,我首先需要找到最差的送货费用,然后显示我们找到的最高费用以及其他选项,这些选项共享我们找到的最高费用uid_pdelopt_prodid

EG:

产品1
德尔类型:一个人
费用:20英镑 产品:3

产品1
德尔类型:两个人
费用:40英镑 产品:3

产品2
德尔类型:一个人
费用:10英镑 产品:4

产品2
德尔类型:两个人
费用:20英镑 产品:4

由于产品1的运费最高,我需要显示产品1的运费。

但是,有两种产品可能会收取相同的运费,在这种情况下,我仍然只需要显示一组选项,但它们必须具有相同的uid_pdelopt_prodid

换句话说,我无法通过uid_pdelopt_prodid显示他们需要关联的选项的混合。

这能解释得更好吗?

2 个答案:

答案 0 :(得分:0)

您需要分组并汇总费用以获得每种情况的总费用。然后按总和排序。第一行将是最大的一行。

另一种选择是使用'having子句'允许你对总和做条件,如sum。

你会说 ... 按x分组 总和(y)= max(y)

答案 1 :(得分: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_prodidtxt_pdelopt_type的最高费用。然后将其加入到原始表中,以过滤到仅具有该最大成本的行。允许您撤回uid_pdelopt