目標
製品の最低価格を取得します。
問題
私の問題を説明するには:
行 1
Product_Id
= 1Product_Name
= "iPhone 5"Market_Name
= "ウォルマート"Product_Original_Price
= "359.00"Product_Promotional_Price
= "319.00"Product_State
= 1 (提供中)行 2
Product_Id
= 1Product_Name
= "iPhone 5"Market_Name
= "アップル"Product_Original_Price
= "359.00"Product_Promotional_Price
= "0.00"Product_State
= 0 (提供されていません)行 3
Product_Id
= 1Product_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`;
クエリが返すもの:
私がすでに試したこと:
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
、値を特定の型として設定します。
完璧に機能しました!! ありがとう!!