3

私はテーブルを持っています:

tblUnit (ID, Name, PriceFrom, PriceTo)

1, Audi, 170, 340
2, BMW,  250, 290
3, Ford, 275, 500
4, Kia,  110, 250
5, VW,   135, 460

そして、次のような事前定義された価格帯があります。

tblPriceRange(ID, PriceFrom, PriceTo)

1,   0,  100
2, 100,  200
3, 200,  300
4, 300,  400
5, 400, 1000

1 つ以上の価格帯に存在する車両の数を数えようとしています。BMW は 1 レンジのみですが、アウディは 3 レンジ、フォードは 3 レンジです。

私が求めている結果は次のようになります。

VehiclesPerRange:
(RangeFrom, RangeTo, NoVehicles)
  0, 100,  0
100, 200,  3
200, 300,  5
300, 400,  3
400, 1000, 2

このフォーラムや他の場所で、範囲によるグループ化に関する多くの投稿を読みました。ただし、これらの例は、範囲に向かってグループ化する必要がある 1 つの単一の価格に焦点を当てています。結合などを介してこれを行う方法は理解していますが、SQL を記述して範囲を範囲にグループ化する方法がわかりません。

どんな提案でも大歓迎です!

4

1 に答える 1

2

範囲が重複する一致する行と結合tblUnitしたい。tblPriceRange2 番目の開始が最初の終了より前にあり、最初の開始が 2 番目の終了より前にある場合、2 つの範囲が重複するため、結合条件は次のようになります。

SELECT *
FROM dbo.tblUnit u
JOIN dbo.tblPriceRange p
ON u.PriceFrom < p.PriceTo
AND p.PriceFrom < u.PriceTo

その後、グループ化してカウントするだけです:

SELECT PriceFrom, PriceTo, COUNT(1)
FROM(
    SELECT p.PriceFrom, p.PriceTo
    FROM dbo.tblUnit u
    JOIN dbo.tblPriceRange p
    ON u.PriceFrom < p.PriceTo
    AND p.PriceFrom < u.PriceTo
)X
GROUP BY PriceFrom, PriceTo;
于 2013-01-28T14:56:58.047 に答える