2017-10-06 5 views
0

特定の条件の下でAccesの中の行に参加

ID BOORP BEGIN_DIEPTE EIND_DIEPTE TEXTUUR1 1 148000 0 10 ZK 2 148000 20 60 ZK 3 148000 60 80 MK 4 148000 80 110 MK 5 148000 110 130 ZK 6 148000 130 160 - 7 148000 160 220 ZZL 8 148000 220 250 - 9 148000 250 300 MK 10 148001 0 20 ZK 11 148001 20 40 - 12 148001 40 210 ZZL 13 148001 210 310 ZZL

私が欲しいものは下に同じテクスチャを持つ特定の行に参加することです以下の条件は:

1)行がマージされるために同じBOORPを有していなければならない

2)だけ連続した行がマージされてもよい

結果は次のようになります。これは、特に私は問題を抱えている第二の条件である

ID BOORP BEGIN_DIEPTE EIND_DIEPTE TEXTUUR1 1 148000 0 60 ZK 3 148000 60 110 MK 5 148000 110 130 ZK 6 148000 130 160 - 7 148000 160 220 ZZL 8 148000 220 250 - 9 148000 250 300 MK 10 148001 0 20 MK 11 148001 20 40 - 12 148001 40 310 ZZL
。 提案がありますか?

答えて

0

これは、SQLのみのソリューションとしては非常に複雑な作業です。

SELECT e.ID, e.BOORP, e.BEGIN_DIEPTE, e.EINDDIEPTE As EIND_DIEPTE, e.TEXTUUR1 
FROM 
(
    SELECT a.ID, a.BOORP, a.BEGIN_DIEPTE, IIF(b.ID Is Null, a.EIND_DIEPTE, b.EIND_DIEPTE) AS EINDDIEPTE, a.TEXTUUR1, b.ID As IDJoined 
    FROM TestTable a 
    LEFT JOIN 
     (
      SELECT c.*, (SELECT Max(d.ID) FROM TestTable d WHERE d.ID < c.ID) As PreviousID 
      FROM TestTable c 
     ) As b 
    ON b.PreviousID = a.ID AND b.BOORP = a.BOORP AND a.TEXTUUR1 = b.TEXTUUR1 
) AS e 
WHERE e.ID NOT IN (
    SELECT b.ID 
    FROM TestTable a 
    INNER JOIN 
     (
      SELECT c.*, (SELECT Max(d.ID) FROM TestTable d WHERE d.ID < c.ID) As PreviousID 
      FROM TestTable c 
     ) As b 
    ON b.PreviousID = a.ID AND b.BOORP = a.BOORP AND a.TEXTUUR1 = b.TEXTUUR1 
) 

それはサブクエリのかなり多くだし、あまりにも多くのビットが深さで説明する:あなたは1つのクエリでそれをしたい場合は 、あなたは(あなたのサンプルデータでテスト)以下のソリューションを使用することができます。つまり、最も内側のサブクエリ(クエリbLEFT JOINは、BOORPTEXTUUR1であり、IDが前のIDの場合、外側のサブクエリ(クエリe)は結果を受け取り、別のものと結合されたすべてのエントリを削除しますエントリ。

これは、2つのエントリを一緒に結合することに注意してください。 2つ以上のエントリを結合したい場合は、この結果の同様のクエリを実行するだけで済みます。

関連する問題