2016-04-01 11 views
0

ショッピングセッション全体で特定の条件(または組み合わせ)に基づいて製品がランク付けされている頻度を知るためにループを作成/使用する際に問題があります。プロシージャまたはファンクションなしの各SELECTおよびCOUNTのループ

これは私が例えば私のDBに持っているものです。

Product  | Price_countWhenCheapest | PriceQuality_countWhenHighest | Promotion_countWhenYes | Exclusivity_countWhenYes  
----------------------------------------------------------------------------------------------------------------------------------------- 
ProductA |   0    |   0      |   1    |   1      
ProductB |   0    |   0      |   0    |   2   
ProductC |   1    |   1      |   0    |   0   
ProductD |   1    |   1      |   2    |   0   

注:私が望む何

Session  | Product  | Price | PriceQuality | Promotion | Exclusivity 
----------------------------------------------------------------------------------------------- 
Session1 | ProductA | 50  |  7   | Yes   | No    
Session1 | ProductB | 40  |  6   | No   | Yes 
Session1 | ProductC | 30  |  8   | No   | No 
Session1 | ProductD | 20  |  9   | Yes   | No 
Session2 | ProductA | 30  |  6   | No   | Yes    
Session2 | ProductB | 40  |  7   | No   | Yes 
Session2 | ProductC | 20  |  9   | No   | No 
Session2 | ProductD | 50  |  8   | Yes   | No 

が存在する各ラベルのための出力のこの種を持っていることですので、私は(クラウド)DBにSUPER特権を持っていないので、手続きや関数を使うことはできません。

編集:私はセッション(セッション3)と私のテストDBを展開すると

  1. 、列 Price_countWhenCheapestとPriceQuality_countWhenHighestは(出力を見て)1を超えていない のカウントを行います。
  2. セッションに関する詳細情報を持つCustomerという別のテーブルがあります。例えば。そのセッションの顧客または性別の年齢。出力にこれをどのようにして結合することができますか:
    2.1。フィルター(WHEREステートメントを使用している可能性があります) '男性'しかないセッション
    2.2。たとえば(サブ)カウントを

    Testrow_id Session Product Price PriceQuality Promotion Exclusivity 
    1 Session1 ProductA 50 7 Yes No 
    2 Session1 ProductB 40 6 No Yes 
    3 Session1 ProductC 30 8 No No 
    4 Session1 ProductD 20 9 Yes No 
    5 Session2 ProductA 30 6 No Yes 
    6 Session2 ProductB 40 7 No Yes 
    7 Session2 ProductC 20 9 No No 
    8 Session2 ProductD 50 8 Yes No 
    9 Session3 ProductA 30 6 No Yes 
    10 Session3 ProductB 40 7 No Yes 
    11 Session3 ProductC 20 9 No No 
    12 Session3 ProductD 50 8 Yes No 
    
    :Price_countWhenCheapest

追加セッション3は、DBをテストするために、男性のお客様は、製品が格安だった(そしておそらくも25歳を持っていた顧客のためにPrice_countWhenCheapest_25)セッションに参加しましたどのように多くを見つけるために「Price_countWhenCheapest_male」という名前今の

出力:

Product Price_countWhenCheapest PriceQuality_countWhenHighest Promotion_countWhenYes Exclusivity_countWhenYes 
ProductA 0 0 1 2 
ProductB 0 0 0 3 
ProductC 1 1 0 0 
ProductD 1 1 3 0 

答えて

0

残念ながら、MySQLはこの場合、私は、あるじゃないので 、私は正常に使用したい多くのことをサポートしていません。動作しますが、あなたは声明の下に試みることができる:

SELECT 
    Product, 
    CASE WHEN b.Product IS NOT NULL THEN 1 ELSE 0 END AS Price_countWhenCheapest, 
    CASE WHEN c.Product IS NOT NULL THEN 1 ELSE 0 END AS PriceQuality_countWhenHighest, 
    SUM(CASE WHEN Promotion = 'Yes' THEN 1 ELSE 0 END) AS Promotion_countWhenYes, 
    SUM(CASE WHEN Exclusivity = 'Yes' THEN 1 ELSE 0 END) AS Exclusivity_countWhenYes 
FROM tablename a 
LEFT JOIN (
    SELECT DISTINCT Product 
    FROM tablename 
    WHERE Price = (SELECT MIN(Price) FROM tablename) 
) b USING (Product) 
LEFT JOIN (
    SELECT DISTINCT Product 
    FROM tablename 
    WHERE PriceQuality = (SELECT MAX(PriceQuality) FROM tablename) 
) c USING (Product) 
GROUP BY Product, Price_countWhenCheapest, PriceQuality_countWhenHighest 

ものの、それが複数回表をスキャンし、個別の部分は本当にこのクエリが速くなっていませんが必要です。

トリックはJOINには製品間で1:1で最も安い価格と最高品質の情報があり、グループを変更しないでグループに含めることができます。実際にカウントが必要な場合は、残りの部分と同じように、SUM()でまとめてグループからそれらの列を削除してください。

+0

ありがとうございました。これは非常に複雑な声明です。私は試してみるが、何が何をするのか把握しなければならない。 – Dev

+0

私の答えが最初の質問を解決したかどうかも言わないうちに質問を拡大しています... –

+0

私は申し訳ありませんが、私が1で説明しようとしたように、最も安い保険料と最高価格は正しく機能します。プロモーションと独占のカウントがしました。 – Dev

関連する問題