2012-02-23 6 views
0

私はこれを分解したと思ったが、多くの結果に戻る。私はこれをもっとうまく説明しようとします。SQLクエリーからの最大値

商品の配送タイプ(つまり、ワンマンデリバリー、ツーマンデリバリー)情報を保持するテーブルがあります。配送コストは製品によって異なり、各製品は複数の配送タイプを持つことができます。

ユーザーが2つの製品をカートに追加する場合、カート内のいずれかの製品から最も高価な配信オプションを表示する必要があります。

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> 

このアプローチにはどのような方法が最適ですか?どんな助けもありがとうございます。

私は自分自身をダミーに売ったと思います!同じ配送オプションと費用を持つ2つの商品がある場合、すべての配送タイプが返されますが、コストはどちらも上回らないためです。

これは現時点では遅いですが、私はあなたを助けようとしています。

私は何をしようとしているのか分からないので、必要なものを達成しようとしています!

最初から試してみましょう。

表:tbl_product_deliveryopt UID:uid_pdelopt 製品ID:uid_pdelopt_prodid
配信タイプ:txt_pdelopt_type
コスト:mon_pdelopt_actcost

このテーブルには、製品に関連した配信タイプが含まれています。製品のuidはuid_productsです。

各製品には、一人配達、二人配達などの複数の配達タイプがあります。

各配送タイプは、製品のサイズによって異なる場合があります。

カートに2つの商品が追加されている場合は、最初に最も安い配送コストを見つけて、見つかった最も高い費用と、最も高いコストのuid_pdelopt_prodidを共有する他のオプションを表示する必要があります。

EG:

製品1
デルタイプ:一人
費用:£20
PRODID:3

製品1
デルタイプ:2人
費用:£40
ProdID:3

プロダクト2
デルタイプ:一の
コスト:£10
PRODID:4

製品2
デルタイプ:2つの
コスト:£20
PRODID:4

製品1が有しているので最高配送料商品1の配送料を表示する必要があります。

ただし、2つの商品で同じ送料がかかる場合があります。この場合でも、1セットのオプションを表示するだけで済みますが、同じuid_pdelopt_prodidである必要があります。

つまり、私はuid_pdelopt_prodidで関連付ける必要があるオプションが混在して表示できません。

それはそれをより良く説明しますか?

+1

要件が私にはっきりしない - あなたの例を単純化できますか?例えばサンプルデータと希望する出力。また、問題に関連するcoldfusionはありますか? – ninesided

+1

テーブルddlを投稿できますか?列の名前は少しわかりにくいです。どのIDがハードコーディングされたリストに関係しているかは不明です: '4,5'。また、SQL型の質問にデータベース型を含めることは常に有効です。 – Leigh

答えて

0

GROUP BYを壊す有するX によって ... グループを言うだろう行はそれ自身のグループに属します。

私はあなたのテーブル構造とどのようなフィールドの意味などについて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」を共有できるのですか?もう一度あなたの助けに感謝します! –

+0

@JasonCongerton - ご迷惑をおかけして申し訳ございませんが、元の質問に** EDIT **ブロックを追加できますか? – ninesided

+0

@Leigh - あなたは私のクエリに何をしたのですか?私は今それを読むことはほとんどできません!私のタイプミスを訂正してくれてありがとう:-) – ninesided

0

状況ごとの総コストを得るには、グループ化して合計する必要があります。合計で注文してください。最初の行が最大になります。

もう一つのオプションは、 'having clause'を使用することです。これは、合計のような集計の条件を実行できるようにします。

あなたは、すべて、それがユニークで独特のフィールドによって、あなたのグループ場合であるので、UIDを取得合計(Y)= MAX(Y)

関連する問題