2017-04-07 17 views
0

私はpostgressqlでspringブートフレームワークに取り組んでいます。 以下に、クエリ1,2、... nの例を示します。これらのクエリは正常に動作しています。しかし、パフォーマンス上の問題のために、(forループ内で)クエリを複数回実行することができないため、これらのクエリを単一のクエリに結合する必要があります。しかし、私はこれらのクエリを組み合わせる考えはありません。複数のSQLクエリを1つのクエリに結合するにはどうすればよいですか?

1. SELECT product_name, count(*) FROM Products WHERE product_name='pro_a1' and price between 20 and 30 group by product_name; 

2. SELECT product_name, count(*) FROM Products WHERE product_name='pro_b1' and price between 50 and 70 group by product_name; 

上記のクエリを以下のように組み合わせて、達成できないようにしたいと考えています。

SELECT product_name, count(*) FROM Products WHERE product_name in("pro_a1", "pro_b1", ...) and price between (20,30) AND (50,70) AND so on. group by product_name; 

タスクを実行するための任意のアイデア。私は春と冬眠の初心者レベルの開発者です。 解決策や役立つリンクをご提案ください。

ありがとうございます。

+0

シナリオでは組合が機能しません – user320676

+0

ああ、残念です。私はあなたが答えで提供される他のアプローチを使うことができると思います。幸運の仲間。 –

答えて

1

条件付き集計を使用できます。

SELECT product_name 
,count(case when product_name='pro_a1' and price between 20 and 30 then 1 end) 
,count(case when product_name='pro_b1' and price between 50 and 70 then 1 end) 
FROM Products 
group by product_name; 
+0

私の場合、n個の製品とn個の価格帯があり、これらの入力をハイバネートクエリで渡す必要があります。 – user320676

0

これは一つの方法である:

SELECT product_name, count(*) 
FROM Products 
WHERE (product_name = 'pro_a1' and price between 20 and 30) OR 
     (product_name = 'pro_b1' and price between 50 and 70)  
GROUP BY product_name; 

あなたが製品ごとに別々のカウントしたい場合:

SELECT product_name, count(*), 
     SUM((product_name = 'pro_a1' and price between 20 and 30)::int) as cnt_a1, 
     SUM((product_name = 'pro_b1' and price between 50 and 70)::int) as cnt_b1 
FROM Products 
WHERE (product_name = 'pro_a1' and price between 20 and 30) OR 
     (product_name = 'pro_b1' and price between 50 and 70)  
GROUP BY product_name; 
+0

お返事ありがとうございます。私の場合、私はハイバネート(HBL)でクエリを書いているので、リストに製品と価格を渡す必要があります。これについてあなたの考えをお伝えください。 – user320676

+0

@ user320676 。 。私はHibernateを使用しませんが、このような基本的な論理式を渡すことができます。 –

0
SELECT product_name, count(*) 
FROM Products 
WHERE product_name='pro_a1' OR product_name='pro_b1' 
AND price between 20 and 30 OR price between 50 and 70 group by product_name; 

を、私は、これはより良いアプローチだと思う、単純明快。 IN文も使用できますが、パフォーマンスはフィルタの数が少ないことに似ています。

関連する問題