2016-05-04 10 views
1

私はある点を横切る航空機の飛行軌跡データのデータベースを持っています。私は航空機がこれらの地点を横切って100フィート毎にビンを入れようとしている高度を見ています。標高は約2000フィートから15000フィートの範囲ですから、100フィート増分を自動化する方法が必要です。だから、私は交差点、範囲(2000〜2100フィート)、およびカウントを持っていたい。次の行は、交差点、次の範囲(2100〜2200フィート)、およびカウントなどです。MS SQL - データの範囲で数えてください

私はまだSQLの初心者ですので、私が正しい方向に指摘されるように助けてください。ありがとう。

わかりやすくするために編集しました。私は何も持っていません。私は交差点のある場所の列と、高度の範囲の列と、数えられた列の列が必要です。私はそれが私に100フィートの増分の範囲を与えるようにデータをビンするのか分からないだけです。

+0

あなたはこれまでどのようなSQLコードを実装しているのですか?プロセスを自動化する場合は、まずプロセスがどのように手動で動作するかを知ることが不可欠です。 –

+0

質問を編集して、サンプルデータをDDL + DMLおよび希望の結果として追加してください。 –

+0

あなたの質問は何ですか? –

答えて

-1

何らかのプロセスを自動化しようとするときは、まず、を手動で実行するアルゴリズムを設計する必要があります。開始するには、範囲xとx + 100の間の高度のカウントを返すこのプロセスの最小の部分を選びます。そこで、X = 2000年、あなたは2000年と2100

SELECT COUNT(*) FROM AltitudesTable 
WHERE altitude >= 2000 AND altitude < 2100; 

上記のコードは1ケースのために働くの間のすべてのレコードを返したいとき:2000 < = X 「自動化」やすべてのケースをループするには

DECLARE @x INT = 2000; 
WHILE EXISTS(SELECT * FROM AltitudesTable) 
BEGIN 
    SELECT COUNT(*) FROM AltitudesTable 
    WHERE altitude >= @x AND altitude < @x+100; 
    @x = @x+100; 
END 

謹んでは、あなたの要件をしっかりと定義されていないので、私はテーブル構造とデータ型に関するいくつかの仮定をしなければならなかった:、T-SQLを使用してみてください。

+0

WHILEまたはカーソルなしで実行します。 – mxix

+0

@mxixこのソリューションは、必要に応じてOPのタスクを自動化するという意味で機能的です。率直に言って私はこれを下降させる理由は見当たりません。より良い提案がなければあいまいなコメントを提供します。もしあなたがカーソルを使わずに現在の範囲をループして追跡する手段を持っていれば、私はすべて耳にします。 :) –

+1

あいまいではありません。あなたがしなければループをしないでください。あなたは複数のオプションを持っています.1つは質問コメントに、もう1つは例を示しています。あるいは、これをTally Tableで解決することもできます。 – mxix

1

AltitudeBucketの計算カラムを使用できます。これは自動的に計算されます。

この場合、計算された列としてAltitudeBucketを使用するということは、その計算をWHERE句で使用できることを意味します。

表を作成して移入します。

CREATE TABLE dbo.TrackPoint 
(
    TrackPointID int NOT NULL IDENTITY(1,1) PRIMARY KEY, 
    CrossingPoint nvarchar(50) NOT NULL, 
    AltitudeFeet int NOT NULL 
     CHECK (AltitudeFeet BETWEEN 1 AND 60000), 
    AltitudeBucket AS (AltitudeFeet/100) * 100 PERSISTED NOT NULL 
); 
GO 

INSERT INTO dbo.TrackPoint (CrossingPoint, AltitudeFeet) 
    VALUES 
     (N'Paris', 12772), 
     (N'Paris', 12765), 
     (N'Paris', 32123), 
     (N'Toulouse', 5123), 
     (N'Toulouse', 6123), 
     (N'Toulouse', 6120), 
     (N'Lyon', 15000), 
     (N'Lyon', 15010); 

テーブルの内容を表示します。

SELECT * 
    FROM dbo.TrackPoint; 

enter image description here

まとめカウントを計算するSELECTクエリを実行します。

SELECT CrossingPoint, AltitudeBucket, COUNT(*) AS 'Count' 
    FROM dbo.TrackPoint 
    GROUP BY CrossingPoint, AltitudeBucket 
    ORDER BY CrossingPoint, AltitudeBucket; 

enter image description here

あなたは高度範囲を表示したい場合。

SELECT CrossingPoint, AltitudeBucket, CAST(AltitudeBucket AS nvarchar) + N'-' + CAST(AltitudeBucket + 99 AS nvarchar) AS 'AltitudeBucketRange', COUNT(*) AS 'Count' 
    FROM dbo.TrackPoint 
    GROUP BY CrossingPoint, AltitudeBucket 
    ORDER BY CrossingPoint, AltitudeBucket; 

enter image description here

関連する問題