1

データベースから製品の売上を価格帯別に抽出しようとしています。

私はかなり複雑な SQL クエリを持っています。

SELECT 
    SUM((t.price-t.discount)*t.quantity) as totalValue, 
    MAX(t.price) as maxP, 
    t.range AS score_range,  
    COUNT(*) AS count  
        FROM 
            (SELECT products.price, 
            salesRecords.discount,
            salesRecords.quantity,  
                CASE WHEN products.price >=0 AND products.price <50 THEN  '0-49' 
                WHEN products.price >=50 AND products.price <100 THEN  '50-99' 
                WHEN products.price >=100 AND products.price <200 THEN  '100-199' 
                WHEN products.price >=200 AND products.price <350 THEN  '200-349' 
                WHEN products.price >=200 AND products.price <350 THEN  '200-349'  
                WHEN products.price >=350 AND products.price <500 THEN  '350-499' 
                WHEN products.price >=500 AND products.price <800 THEN  '500-799' 
                WHEN products.price >=800 AND products.price <1200 THEN  '800-1199' 
                WHEN products.price >=1200 AND products.price <1800 THEN  '1200-1799' 
                WHEN products.price >=1800 AND products.price <2500 THEN  '1800-2499' 
                ELSE '2500 +' END 
            AS  range  FROM salesRecords 
                LEFT JOIN products ON products.id=salesRecords.itemNo 
                ORDER BY products.price DESC)t 
    GROUP BY t.range 
    ORDER BY maxP DESC

うまくいけば、ここで何が起こっているかがわかります。価格帯内で製品をグループ化し、販売額を合計すると、次のような出力が得られます。

totalValue  maxP         score_range    count   
8381    251.17       200-349        35
32522   199.00       100-199        198
22614   99.95        50-99      271
41825   49.99        0-49       2765

ただし、ご覧のとおり、この特定のデータセットには多くのギャップがあります。

35-499、500-799 などのデータが欠落しているscore_ranges の値のみがあります。これは、これらの値のデータがないためです...これは問題ありません...ただし...このデータを JSON として挿入しています200-349, 100-199,50-99, 0-49オブジェクトをAmChartsレーダーチャートに変換し、データがアプリケーションにとって本当に意味のあるものになるようにするには、すべての範囲を取得し、単純に を入力する必要があるzerosため、取得したいのは次のとおりです。

totalValue  maxP     score_range    count   
0       3500         2500 +             0
0       2499         1800-2499          0
0       1799         1200-1799          0
0       1199         800-1199           0
0       799          500-799            0
0       499          350-499            0
8381    251.17       200-349            35
32522   199.00       100-199            198
22614   99.95        50-99              271
41825   49.99        0-49               2765
4

1 に答える 1

0

あなたはすべての範囲を持っているので、駆動テーブルが必要です. 次に例を示します。

SELECT tsum.totalValue, 
       maxP, 
       range.range AS score_range,  
       coalesce(count, 0) count  
FROM (select '0-49' as range union all
      select '50-99' union all
      . . .
     ) as range left outer join
     (SELECT SUM((t.price-t.discount)*t.quantity) as totalValue, 
             MAX(t.price) as maxP, 
             t.range AS score_range,  
             COUNT(*) AS count
      from (SELECT products.price, 
                   salesRecords.discount,
                   salesRecords.quantity,  
                   (CASE WHEN products.price >=0 AND products.price <50 THEN  '0-49' 
                         WHEN products.price >=50 AND products.price <100 THEN  '50-99' 
                         WHEN products.price >=100 AND products.price <200 THEN  '100-199' 
                         WHEN products.price >=200 AND products.price <350 THEN  '200-349' 
                         WHEN products.price >=200 AND products.price <350 THEN  '200-349'  
                         WHEN products.price >=350 AND products.price <500 THEN  '350-499' 
                         WHEN products.price >=500 AND products.price <800 THEN  '500-799' 
                         WHEN products.price >=800 AND products.price <1200 THEN  '800-1199' 
                         WHEN products.price >=1200 AND products.price <1800 THEN  '1200-1799' 
                         WHEN products.price >=1800 AND products.price <2500 THEN  '1800-2499' 
                         ELSE '2500 +'
                    END) AS  range
            FROM salesRecords LEFT JOIN
                 products
                 ON products.id=salesRecords.itemNo 
           )t
     ) tsum
     on ranges.range = tsum.score_range
GROUP BY ranges.range 
ORDER BY maxP DESC

ただし、この例は、範囲の制限が定義された Ranges テーブルが本当に必要であることを示唆しています。次に、case ステートメント全体を結合として実行できます。

于 2012-09-10T21:01:33.510 に答える