7

目標

製品の最低価格を取得します。

問題

私の問題を説明するには:

行 1

  • Product_Id= 1
  • Product_Name= "iPhone 5"
  • Market_Name= "ウォルマート"
  • Product_Original_Price= "359.00"
  • Product_Promotional_Price= "319.00"
  • Product_State= 1 (提供中)

行 2

  • Product_Id= 1
  • Product_Name= "iPhone 5"
  • Market_Name= "アップル"
  • Product_Original_Price= "359.00"
  • Product_Promotional_Price= "0.00"
  • Product_State= 0 (提供されていません)

行 3

  • Product_Id= 1
  • Product_Name= "iPhone 5"
  • Market_Name= "ベストバイ"
  • Product_Original_Price= "359.00"
  • Product_Promotional_Price= "299.00"
  • Product_State= 1 (提供中)

次のトピック ( What I have299.00 ) のクエリは、上記の問題の最良価格として 0 を返しBestBuyますProduct_Promotional_Price

私が持っているもの

SELECT
  MIN(LEAST(`Product_Original_Price`, `Product_Promotional_Price`)) as `minProductPrice`
[...]

詳細

私のクエリ:

    SELECT  `pr`.`Product_Id` as `productId`,
    `pr`.`Product_Name` as `productName`,
    ROUND(CAST(MIN(`map`.`Product_Original_Price`) AS DECIMAL)/100,2) 
      as `minProductPrice`,
    `prm`.`Product_Measure_Name` as `measureName`,
    `prm`.`Product_Measure_Shortname` as `measureShortName`,
    `pri`.`Product_Thumbnail_Image_Url` as `thumbnailUrl`,
    `pr`.`Product_Markets_Quantity` as `numberOfMarketsThatHaveThisProduct`
FROM `bm_market_products` as `map`
JOIN `bm_products` as `pr` ON `map`.`Product_Id` = `pr`.`Product_Id`
JOIN `bm_products_category_relationship` as `car` ON `pr`.`Product_Id` =
      `car`.`Product_Id`
JOIN `bm_product_categories` as `ca` ON `car`.`Category_Id` = `ca`.`Category_Id`
JOIN `bm_products_measure_relationship` as `prmr` ON `pr`.`Product_Id` = 
      `prmr`.`Product_Id`
JOIN `bm_product_measures` as `prm` ON `prmr`.`Measure_Id` =
      `prm`.`Product_Measure_Id`
JOIN `bm_products_images` as `pri` ON `pr`.`Product_Id` = `pri`.`Product_Id`
WHERE ("" IS NULL OR `map`.`Product_State` = 0)
AND ("" IS NULL OR `ca`.`Category_Id` = 14)
GROUP BY `map`.`Product_Id`;

クエリが返すもの:

SQL結果

私がすでに試したこと:

Product_State製品が提供されているかどうかを判断することを考慮して、次のフラグメントに従ってください。

SELECT  `pr`.`Product_Id` as `productId`,
    `pr`.`Product_Name` as `productName`,
    (IF(`map`.`Product_State` <> 0) THEN
      MIN(LEAST(`Product_Original_Price`, `Product_Promotional_Price`))
    ELSE (`map`.Product_Original_Price) as `minProductPrice`,
    `prm`.`Product_Measure_Name` as `measureName`,
    `prm`.`Product_Measure_Shortname` as `measureShortName`,
    `pri`.`Product_Thumbnail_Image_Url` as `thumbnailUrl`,
    `pr`.`Product_Markets_Quantity` as `numberOfMarketsThatHaveThisProduct`
[...]

IF/THEN/ELSEが見えますか? これは、前のクエリに関連して追加されたものです。

上記のクエリは機能しません — 構文が正しくないことはわかっていますが、単に説明するためのものです。

ソリューション

ゴードン・リノフがこの回答を投稿し、それで私はこれを作りました:

SELECT  [...]
    ROUND(CAST(MIN(CASE WHEN `map`.`Product_Promotional_Price` = 0 THEN `map`.`Product_Original_Price`
            ELSE LEAST(`map`.`Product_Promotional_Price`, `map`.`Product_Original_Price`)
       end) AS DECIMAL)/100,2) as `minProductPrice`,
        [...]

明確にするために、私は彼の [Gordon Linoff] 構文を私のシナリオに適合させただけです —ROUND数値を丸めCAST、値を特定の型として設定します。

完璧に機能しました!! ありがとう!!

4

2 に答える 2

4

最低価格を取得するためのロジックを修正する必要があります。case ステートメントが最善の方法です。以下に例を示します。

select MIN(case when `Product_Promotional_Price` = 0 then `Product_Original_Price`
                else least(`Product_Promotional_Price`, `Product_Original_Price`)
           end)
于 2013-06-18T19:12:34.700 に答える
0

最後に置くwhere Product_Original_Price!=0 and Product_Promotional_Price!=0;

于 2013-06-18T19:11:22.600 に答える