2011-01-23 9 views
3

このSQLクエリをより効率的にするにはどうすればよいですか?SQLクエリをより効率的にする

SELECT 
    (SELECT COUNT(*) FROM table WHERE price < 10) AS priceUnder10, 
    (SELECT COUNT(*) FROM table WHERE price BETWEEN 10 AND 20) AS price10to20, 
    (SELECT COUNT(*) FROM table WHERE price > 20) AS priceOver20, 
    (SELECT COUNT(*) FROM table WHERE colour = 'Red') AS colourRed, 
    (SELECT COUNT(*) FROM table WHERE colour = 'Green') AS colourGreen, 
    (SELECT COUNT(*) FROM table WHERE colour = 'Blue') AS colourBlue; 

私はすでにpricecolour列に対するインデックスを持っているので、私はデータを集計するためのより良い方法を探しています。

私はGROUP BY,HAVINGの自己結合とウィンドウ関数を使用してみましたが、同じ結果を得る方法はありません。

ご迷惑をおかけして申し訳ございません。

答えて

8
SELECT 
     COUNT(CASE WHEN price < 10 THEN 1 END) AS priceUnder10, 
     COUNT(CASE WHEN price BETWEEN 10 AND 20 THEN 1 END) AS price10to20, 
     COUNT(CASE WHEN price> 20 THEN 1 END) AS priceOver20, 
     COUNT(CASE WHEN colour = 'Red' THEN 1 END) AS colourRed, 
     COUNT(CASE WHEN colour = 'Green' THEN 1 END) AS colourGreen, 
     COUNT(CASE WHEN colour = 'Blue' THEN 1 END) AS colourBlue 
from YourTable 
WHERE price IS NOT NULL OR colour IN ('Red','Green','Blue') 
+1

おかげで、偉大な答えが、なぜ 'WHERE'必要がありますか? – gjb

+2

@gjb - あなたは1,000,000の行テーブルを持っていて、1行だけが '' Red ''、 'Green'、 'Blue' 'に非nullの価格や色を持つと想像しているかもしれません。他の999,999行は、結果との違いはありますが、それでもスキャンされません。もちろん、あなたのデータにはこのディストリビューションがないことを知っているかもしれません( 'price'はnull値ではないかもしれません)。 –

2

データベースがブール式を処理する方法に応じて、この:

select sum(price<10),sum(price between 10 and 20)... from tab; 

またはこの

select sum(case when price<10 then 1 else 0 end),sum(case when price between 10 and 20 then 1 else 0 end)... from tab; 

は役立つかもしれません。

0
SELECT count(*) as products, 

if(price < 10, 'price band 1', 
if (price between 10 and 20, 'price band 2', 
    'price band 3' 
) 
) as priceband, 
    t.colour 

from table t 
group by t.colour, pricebrand 

あなたを与えるだろう

products colour priceband 
53   red  price band 1 
65   red  price band 2 
12   blue  price band 1 
23   blue  price band 2 

など

+0

これは私が探していたものではない結果を入れ子にしています。それでも、知っておくと便利です。ありがとうございます。 – gjb

関連する問題