1

以下は、私の brand_of_items テーブルのスキーマです。簡単にするために、ここでは id (プライマリと AI)、シンボル (varchar 50、一意) の 2 つの列を示しています。

Table - brand_of_items
id   symbol
0    a
1    b
2    c
..   ..
10   j

以下は、私の items_of_brand のスキーマです。

Table - mainIndexQuantity
id  brand_of_items_id   vol  item_type  salefinalizeddate
0         1              5      0       2005-5-11
1         1              6      0       2004-5-11
2         1              7      0       2011-5-11
3         1              8      0       2011-5-12
4         1              9      0       2011-5-12
5         1              10     0       2011-5-11
6         1              5      1       2012-5-11
7         1              6      1       2012-5-11
8         1              7      1       2011-5-11
9         1              8      1       2010-5-12
10        1              9      1       2012-5-12
11        1              10     1       2005-5-12

mainIndexQuantity テーブルの brand_of_items_id 列は、brand_of_items (id) を指す外部キーです。mainIndexQuantity テーブルの item_type 列は外部キーではありません。

2 つのアイテム タイプ: 0 = 小売、1 = 卸売

each_brand_of_items テーブル エントリごとにアイテムの種類 (小売と卸売) の比率を計算したいと考えています。目標は、あるブランドのアイテムが小売または卸売でより売れているかどうかを確認することです。


** 複雑さの追加: mainIndexQuantity テーブルに日付列を追加し、RetailVolume と WholesaleVolume の合計の差を見つけて、salefinalizeddate フィールドで結果をグループ化したいと考えています。

これは、どの季節にどのアイテムがより多く売れたかを判断するのに役立ち、RetailVolume と WholeSaleVolume の合計の (デルタ) 差は、最も注意を払うべきアイテムを選択するのに役立ちます。

4

1 に答える 1

5

これを試して:

SELECT 
  b.id,
  b.symbol,
  IFNULL(SUM(m.item_type = 1), 0) / (COUNT(*) * 1.0) AS wholesaleRatio,
  IFNULL(SUM(m.item_type = 0), 0) / (COUNT(*) * 1.0) AS RetailRatio
FROM brand_of_items b
LEFT JOIN mainIndexQuantity m ON b.id = m.brand_of_items_id
GROUP BY b.id, 
         b.symbol;

SQL フィドルのデモ

これにより、次のことが得られます。

| ID | SYMBOL | WHOLESALERATIO | RETAILRATIO |
----------------------------------------------
|  0 |      a |              0 |           0 |
|  1 |      b |            0.5 |         0.5 |
|  2 |      c |              0 |           0 |
| 10 |      j |              0 |           0 |

仮定して:

  • wholesaleRatioは、すべての商品の数に対する卸売タイプの商品の数です。
  • RetailRatioretailすべてのアイテムの数に対するtype のアイテムの数です。

この比率が合計に対するvol列の合計に対するものである場合volは、代わりにこれを行うことができます。

SELECT 
  b.id,
  b.symbol,
  SUM(CASE WHEN m.item_type = 1 THEN m.vol ELSE 0 END) / SUM(m.vol) AS wholesaleRatio,
  SUM(CASE WHEN m.item_type = 0 THEN m.vol ELSE 0 END) / SUM(m.vol) AS RetailRatio
FROM brand_of_items b
LEFT JOIN mainIndexQuantity m ON b.id = m.brand_of_items_id
GROUP BY b.id, 
         b.symbol;

ご了承ください:

  • を使用して、結果セットで一致しない行、つまり、テーブルLEFT JOINにエントリがないブランド アイテムを取得しました。MainIndexQuantityそれらを含めたくない場合は、INNER JOIN代わりに使用してください。
  • 1.0@JWで指摘されているように、小数点以下の桁数を取得するための乗算。

更新 1

を含めるにはTotal Volume、これRetail Volume SumWholesale Volume sum試してください:

SELECT 
  b.id,
  b.symbol,
  IFNULL(SUM(m.item_type = 1), 0) * 1.0 / COUNT(*)     AS wholesaleRatio,
  IFNULL(SUM(m.item_type = 0), 0) * 1.0 / COUNT(*)     AS RetailRatio,
  IFNULL(SUM(m.vol), 0)                                AS 'Total Volume',
  SUM(CASE WHEN m.item_type = 1 THEN m.vol ELSE 0 END) AS 'Retail Volume sum',
  SUM(CASE WHEN m.item_type = 1 THEN m.vol ELSE 0 END) AS 'Wholesale Volume sum'
FROM brand_of_items b
LEFT JOIN mainIndexQuantity m ON b.id = m.brand_of_items_id
GROUP BY b.id, 
         b.symbol;

SQL Fiddle Demo を更新しました。

これにより、次のことが得られます。

| ID | SYMBOL | WHOLESALERATIO | RETAILRATIO | TOTAL VOLUME | RETAIL VOLUME SUM | WHOLESALE VOLUME SUM |
--------------------------------------------------------------------------------------------------------
|  0 |      a |              0 |           0 |            0 |                 0 |                    0 |
|  1 |      b |            0.5 |         0.5 |           90 |                45 |                   45 |
|  2 |      c |              0 |           0 |            0 |                 0 |                    0 |
| 10 |      j |              0 |           0 |            0 |                 0 |                    0 |

これらの合計と合計で結果セットを並べ替えたい場合は、このクエリをサブクエリに入れて、次のようにします。

SELECT *
FROM
(
   SELECT 
      b.id,
      b.symbol,
      IFNULL(SUM(m.item_type = 1), 0) * 1.0 / COUNT(*)     AS wholesaleRatio,
      IFNULL(SUM(m.item_type = 0), 0) * 1.0 / COUNT(*)     AS RetailRatio,
      IFNULL(SUM(m.vol), 0)                                AS TotalVolume,
      SUM(CASE WHEN m.item_type = 1 THEN m.vol ELSE 0 END) AS RetailVolumeSum,
      SUM(CASE WHEN m.item_type = 1 THEN m.vol ELSE 0 END) AS WholesaleVolumeSum
    FROM brand_of_items b
    LEFT JOIN mainIndexQuantity m ON b.id = m.brand_of_items_id
    GROUP BY b.id, 
             b.symbol
) AS sub
ORDER BY RetailVolumeSum    DESC, 
         WholesaleVolumeSum DESC;

しかし、あなたの最後の要件は明確ではありません.最も高いレシオ/卸売率とボリュームを持つアイテムのブランドを探していますか、それともそれらの最高値を選択していますか?

後者の場合:

SELECT *
FROM
(
   SELECT 
      b.id,
      b.symbol,
      IFNULL(SUM(m.item_type = 1), 0) * 1.0 / COUNT(*)     AS wholesaleRatio,
      IFNULL(SUM(m.item_type = 0), 0) * 1.0 / COUNT(*)     AS RetailRatio,
      IFNULL(SUM(m.vol), 0)                                AS TotalVolume,
      SUM(CASE WHEN m.item_type = 1 THEN m.vol ELSE 0 END) AS RetailVolumeSum,
      SUM(CASE WHEN m.item_type = 1 THEN m.vol ELSE 0 END) AS WholesaleVolumeSum
    FROM brand_of_items b
    LEFT JOIN mainIndexQuantity m ON b.id = m.brand_of_items_id
    GROUP BY b.id, 
             b.symbol
) AS sub
ORDER BY RetailVolumeSum    DESC, 
         WholesaleVolumeSum DESC,
         TotalVolume        DESC
LIMIT 1;

更新 2

総量が最も多いブランドを取得するには、次のようにします。

SELECT 
  b.id,
  b.symbol,
  IFNULL(SUM(m.item_type = 1), 0) * 1.0 / COUNT(*)     AS wholesaleRatio,
  IFNULL(SUM(m.item_type = 0), 0) * 1.0 / COUNT(*)     AS RetailRatio,
  IFNULL(SUM(m.vol), 0)                                AS TotalVolume,
  SUM(CASE WHEN m.item_type = 1 THEN m.vol ELSE 0 END) AS RetailVolumeSum,
  SUM(CASE WHEN m.item_type = 1 THEN m.vol ELSE 0 END) AS WholesaleVolumeSum
FROM brand_of_items b
LEFT JOIN mainIndexQuantity m ON b.id = m.brand_of_items_id
GROUP BY b.id, 
         b.symbol
HAVING SUM(m.vol) = (SELECT MAX(TotalVolume)
                     FROM
                     (
                       SELECT brand_of_items_id, SUM(vol) AS TotalVolume
                       FROM mainIndexQuantity
                       GROUP BY brand_of_items_id
                     ) t);

このように

ご了承ください:

  • これにより、総量が最も多いブランドが得られます。比率が最も高いブランドを探している場合は、having 句を置き換えて、総量の最大ではなく比率の最大値を取得する必要があります。

  • これにより、合計ボリュームが最大のアイテムが得られるため、この更新された fiddle demoのように、合計ボリュームが最大のアイテムが複数ある場合は、複数のアイテムがあると予想される場合があります。この場合、1 つだけを取得するには、 を使用LIMITして 1 つだけを返す必要があります。

于 2013-02-06T02:40:45.180 に答える