0

いくつかの価格 (この例では 3 つ) を持つ SELECT クエリからのデータ行があります。1 つは当社の価格、1 つは競合他社 1 の価格、もう 1 つは競合他社 2 の価格です。他の 2 つの価格と比較した価格のランクを表示する列を追加したいと考えています。私たちの価格が最低の場合、それは番号 1 を吐き出し、最高の場合、それが吐き出す数を吐き出します。

このようなもの:

Make |  Model  |  OurPrice | Comp1Price  | Comp2Price | Rank |  OutOf
MFG1    MODEL1     350         100           500         2        3
MFG1    MODEL2     50          100           100         1        3
MFG2    MODEL1     100         NULL          50          2        2
MFG2    MODEL2     9999        500           NULL        2        2

-上記のように競合他社の価格が NULL になることがありますが、これが私の問題だと思います。私は試してみましたCASEが、競合他社が1つしかない場合に機能しますが、ANDステートメントを追加すると、すべてのランクが吐き出されますNULL。MySQLクエリを介してこれを行うより良い方法はありますか?

SELECT
      MT.MAKE as Make,
      MT.MODEL as Model,
      MT.PRICE as OurPrice,
      CT1.PRICE as Comp1Price,
      CT2.PRICE as Comp2Price,
      CASE
         WHEN MT.PRICE < CT1.PRICE AND MT.PRICE < CT2.PRICE
         THEN 1 END AS Rank
      (CT1.PRICE IS NOT NULL) + (CT2.PRICE IS NOT NULL) + 1 as OutOf
  FROM mytable MT

LEFT JOIN competitor1table as CT1 ON CT1.MODEL = MT.MODEL
LEFT JOIN competitor2table as CT2 ON CT2.MODEL = MT.MODEL

ORDER BY CLASS
4

2 に答える 2

1

テストされていませんが、試すことができます:

SELECT
    a.MAKE AS Make,
    a.MODEL AS Model,
    a.PRICE AS OurPrice
    MAX(CASE WHEN a.compnum = 1 THEN pricelist END) AS Comp1Price,
    MAX(CASE WHEN a.compnum = 2 THEN pricelist END) AS Comp2Price,
    FIND_IN_SET(a.PRICE, GROUP_CONCAT(a.pricelist ORDER BY a.pricelist)) AS Rank,
    COUNT(a.pricelist) AS OutOf
FROM
(
    SELECT MAKE, MODEL, PRICE, PRICE AS pricelist, 0 AS compnum
    FROM mytable

    UNION ALL

    SELECT a.MAKE, a.MODEL, a.PRICE, CT1.PRICE, 1
    FROM mytable a
    LEFT JOIN competitor1table CT1 ON a.MODEL = CT1.MODEL

    UNION ALL

    SELECT a.MAKE, a.MODEL, a.PRICE, CT2.PRICE, 2
    FROM mytable a
    LEFT JOIN competitor2table CT2 ON a.MODEL = CT2.MODEL
) a
GROUP BY
    a.MAKE, a.MODEL
于 2012-07-10T22:42:01.813 に答える