2017-02-06 8 views
0

私はSQLを初めて使用しており、以下のクエリは、ある期間内に0〜100 kmの間を移動した車両の数を計算することです。ここでdistance_two_points範囲内のデータを取得するには?

select 1 as "1 - 100",count (*) from (
SELECT extract (day from start_time) as day ,place, vehicle_id,sum(distance_two_points) as distance 
FROM public.datatable where start_time >= '2015-09-05 00:00:00' and start_time <= '2015-09-05 23:59:59' 
and place=1 group by day, place ,veh_id 
order by day,place,veh_id) as A where distance >0 and distance<100 

は、1回の旅行での距離を示しており、車両が、私は車の走行距離の合計を与える各vehicle_idためdistance_two_pointsの合計を取るtrip.So以上のものを持っています。

SELECT extract (day from start_time) as day ,place, vehicle_id,sum(distance_two_points) as distance 
FROM public.datatable where start_time >= '2015-09-05 00:00:00' and start_time <= '2015-09-05 23:59:59' 
and place=1 group by day, place ,veh_id 
order by day,place,veh_id 

は、すべての車両の総走行距離を返しますし、私は、私は次のように分類する

distance >0 and distance<100 

代わりの1つのフィルタリングによってフィルタリングサブクエリ:

 range  count 
    ______ ______ 
    1-100  17 
    100-200 30 
    300-400 40 
    400-500 39 
    500-600 36 

5つのクエリを組み合わせる代わりに、上記の結果を得る方法がありますか?どんな助けもありがとうございます。

+0

あなたの質問は本当に混乱しています。あなたは 'sum(points)as length'を持ち、' ​​where'節で 'length'を使います。それらは異なる長さです。 –

+0

@ GordonLinoff以前よりクエリが編集されました –

+0

申し訳ありませんが、以前よりも混乱しています... –

答えて

1

group byキーにはcaseを使用できます。あなたはこのような何かをしたいように見える:

SELECT (CASE WHEN points >= 0 AND points <= 100 THEN '1-100' 
      WHEN points <= 200 THEN '101-200' 
      WHEN points <= 300 THEN '201-300' 
      WHEN points <= 400 THEN '301-400' 
      WHEN points <= 500 THEN '401-500' 
      WHEN points <= 600 THEN '501-600' 
     END) as range, 
     COUNT(*) as length 
FROM public.datatable 
WHERE start_time >= '2015-09-05' and start_time < '2015-09-06' and 
     place = 1 and length>=0 and length<=100 and place=1 
GROUP BY range 
ORDER BY MIN(points); 
+0

count(*)の近くに文法エラーがあることを示しています –

+0

'points'が負の値である場合、すべての場合は(少なくとも)' points> = 0 AND ... 'で始める必要があります。それ。 – pozs

0

あなたがテキストを決定しない機能を使用することができます。

CREATE or replace FUNCTION points_diff(int) 
RETURNS text 
LANGUAGE sql 

AS $function$ 

select 
     a::text||'-'||(a+99)::text 
from 
     generate_series(1,$1+100,100) a 
where 
     $1 between a and a+99; 

$function$ 

; 
+0

です。これは(WHEREフィルタの前に)生成される多くの組み合わせです。 'aとa + 99の間に' $ 1だけ言うなら、それは簡単ではないでしょうか? – pozs

+0

質問を編集しました。また、回答を確認してください。 –

0
WITH x AS (
    SELECT extract (day from start_time) as day, 
      place, 
      vehicle_id, 
      sum(distance_two_points) as distance 
     FROM public.datatable 
     where start_time >= '2015-09-05 00:00:00' 
     and start_time <= '2015-09-05 23:59:59' 
     and place=1 
    group by day, place ,veh_id 
), z AS (
    SELECT ((distance - 1)/100)::int8 AS range, 
      count (*) 
     FROM x 
    GROUP BY 1 
) 
    SELECT (range * 100 + 1)::text || '-' || ((range + 1) * 100), 
     count 
    FROM z 
ORDER BY range 
+0

質問を編集しました。回答も変更してください –

0

ケースが正常に動作します。 @ Gordon Linoffは、私はケースを使用しなければならないと示唆し、それは魅力のように動作します。それは誰にも役立つことを願う

SELECT (CASE WHEN distance >= 0 AND distance< 10000 THEN '0-10' 
       WHEN distance >= 10000 AND distance < 20000 THEN '10-20' 
       WHEN distance >= 20000 AND distance <30000 THEN '20-30' 
       WHEN distance >= 30000 AND distance < 40000 THEN '30-40' 
       WHEN distance >= 40000 AND distance < 50000 THEN '40-50' 
        WHEN distance >= 50000 AND distance < 60000 THEN '50-60' 
       WHEN distance >= 60000 AND distance <70000 THEN '60-70' 
       WHEN distance >= 70000 AND distance < 80000 THEN '70-80' 
       WHEN distance >= 80000 AND distance < 100000 THEN '80-90' 
       WHEN distance >=90000 THEN 'above 100' 
      END) as range,count(*) as taxi_count 
      from (



      SELECT extract (day from start_time) as day, place,taxi_num_id,sum(distance_two_points) as distance 
    FROM public.datatable where start_time >= '2015-09-05 00:00:00' and start_time <= '2015-09-05 23:59:59' and place=1 
     group by day,veh_id,place 
    order by day,veh_id 



) as A group by range order by range 
関連する問題