1

さまざまな製品の価格を格納するテーブルがあり、価格が同じ日に他のレコードより低い、高い、または等しい場合に返すクエリの実行方法を知りたいです。idmonitor ゼロを含むすべてのレコードは、これが私の価格であり、同じ日に他のレコードと比較することを意味します。

id | idmonitor | idproduct | price | date
1  | 0         | 5         | 42.00 | 2012-06-01
2  | 1         | 5         | 45.00 | 2012-06-01
3  | 2         | 5         | 50.00 | 2012-06-01
4  | 0         | 6         | 22.00 | 2012-06-01
5  | 1         | 6         | 24.00 | 2012-06-01
6  | 2         | 6         | 26.00 | 2012-06-01
7  | 0         | 5         | 40.00 | 2012-06-03
8  | 1         | 5         | 40.00 | 2012-06-03
9  | 2         | 5         | 40.00 | 2012-06-03
10 | 0         | 6         | 30.00 | 2012-06-03
11 | 1         | 6         | 20.00 | 2012-06-03
12 | 2         | 6         | 10.00 | 2012-06-03

次のようなクエリを返したいと思います。

date       | below | equal | above
2012-06-01 | 2     | 0     | 0
2012-06-02 | 2     | 0     | 0
2012-06-03 | 0     | 1     | 1

このクエリを作成しようとしていますが、すでに数日です。

4

2 に答える 2

2

次のようなものは、パフォーマンスの点では最適なクエリではありませんが、うまくいく可能性があります。

select aux.date,
       SUM(aux.below) as 'below',
       SUM(aux.equal) as 'equal',
       SUM(aux.above) as 'above'
from
(
   select t1.date,
          t1.idproduct,
          (select count(1) from tablename t2 where t2.date = t1.date and t2.idproduct = t2.idproduct and t2.price > t1.price and t2.idmonitor <> 0) as 'below',
          (select count(1) from tablename t3 where t3.date = t1.date and t3.idproduct = t3.idproduct and t3.price = t1.price and t3.idmonitor <> 0) as 'equal',
          (select count(1) from tablename t4 where t4.date = t1.date and t4.idproduct = t4.idproduct and t4.price < t1.price and t4.idmonitor <> 0) as 'above',
   from tablename t1
   where t1.idmonitor = 0
) aux
group by aux.date

記憶違いなので、見落としがあるかもしれませんがご了承ください。

于 2012-06-12T16:40:25.997 に答える
1

これを編集して、idmonitor=0 に基づいて基本価格を取得しました。ローカル DB に対して動作するバージョンがありますが、フィールド名が異なるため、1 つまたは 2 つのタイプミスがある可能性があります。

select date, 
  sum(equal_price) as equals,
  sum(above_price) as above,
  sum(below_price) as below from (
select date,
  if (price = base_price, 1, 0) as equal_price,
  if (price > base_price, 1, 0) as above_price,
  if (price < base_price, 1, 0) as below_price
  from orders
  join (select 
    date as base_date, 
      price as base_price
     from orders where idmonitor = 0) as base_price on base_price.base_date = date) as counts
     group by date
于 2012-06-12T16:49:17.177 に答える