2012-02-23 81 views
0

我以爲我有這個破解,但它返回到許多結果。我會盡力解釋這一點。來自SQL查詢的最大值

我有一張表,它包含產品的交付類型(即一個人交貨,雙人交貨)信息。每個產品的交貨成本會有所不同,每個產品可能有多種交貨類型。

如果用戶將兩種產品添加到購物車中,我需要顯示購物車中任一產品的最昂貴的配送選項。

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

每種產品都可以有多種交貨類型,例如單人交貨,雙人交貨。

根據產品的尺寸,每種交付類型可能會有不同的成本。

如果將兩件產品添加到購物車中,我首先需要找到最親愛的運費,然後顯示我們發現的最高成本以及我們發現的最高成本的其他選項。

EG:

產品1
德爾類型:單曼
價格:£20
的ProdID:3

產品1
德爾型:雙曼
成本:£40
產品編號:3

產品2
德爾類型:單曼
價格:£10
的ProdID:4

產品2
德爾型:雙曼
價格:£20
的ProdID:4

由於產品1具有我需要顯示產品1的運費。

但是,兩種產品可能具有相同的送貨費用,在這種情況下,我仍然只需要顯示一組選項,但它們必須具有相同的uid_pdelopt_prodid

換句話說,我不能顯示它們需要與uid_pdelopt_prodid相關的選項的混合。

這是否說明它更好?

+1

我的要求根本不清楚 - 你能簡化你的例子嗎?例如樣本數據和期望的輸出。另外,coldfusion與問題有關嗎? – ninesided 2012-02-23 23:41:53

+1

你可以發表ddl嗎?列名稱有點神祕。目前還不清楚哪些id與硬編碼列表有關:'4,5'。另外,將sql數據庫類型包含sql問題總是很好。 – Leigh 2012-02-24 01:03:20

回答

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

+0

嗨Ninesided,感謝它現在正常工作。只是一個簡單的問題,如果我需要確保交付類型與產品ID相關,即只顯示最親密的交付類型,並且都可以共享'uid_pdelopt_prodid'?再次感謝你的幫助! – 2012-02-24 00:59:40

+0

@JasonCongerton - 對不起,我不確定我是否理解(再次!)你可以添加一個**編輯**塊到原始問題與你的意思嗎? – ninesided 2012-02-24 01:35:15

+0

@Leigh - 你對我的查詢做了什麼?我現在幾乎讀不懂了!感謝您糾正我的錯字,儘管:-) – ninesided 2012-02-24 01:36:00

0

您需要將成本進行分組並計算總成本。然後按總數排序。第一排將是最大的。

另一種選擇是使用'having子句',允許您對sum等條件進行聚合。

你會說 ... 集團通過X 有總和(Y)= MAX(Y)