2009-06-03 14 views
0

: (すべてのテキストフィールド)複雑アクセスSQLクエリの除外

 
Co1 Co2 Co3 Co4 
A k t N1 
B k t N2 
A m t N3 
B k z N4 
A k z N5 
C m t N6 
C k z N7 
C k t N8 
A k t N9 
C m t N10 

私は次のことを行うと、レポートのいくつかの種類を作成する必要があります。

結果行を選択する必要があります。

  1. 、その後のCo2
  2. 最初Co1の順のオーダー
  3. データのみを含む場合のCo3 = TまたはR
  4. のCo3がTれていないにもR、次いで前C04 Co1を、二酸化炭素と他のすべての行が現在の行と同じであった場合もまた除外

1,2,3は非常に簡単ですが(それぞれOrder byとWhere句)、 はアクセスSQLで#4を実行できますか? できない場合は、データをループする小さなC#アプリケーションを作成しますが、これは がSQLで可能でなければならないと感じています。

実際のクエリとデータベースは複雑ですが、#4は私が立ち往生した場所です。

 
A m t N3 
A k t N9 
C m t N6 
C m t N10 
C k t N8

私はこのカバーにすべての可能な例を信じて:私は、結果は次のようになりました例で

精度は、 の順番を決定するために4番目の列(この例ではC4)を使用しますが、文字と数字を含むテキストフィールドです。 フィールドはA01、A02、.. A99、B01などの2桁の文字です。 精度#2、私はこのデータベース設計の責任がありません。 :P

だから、SQLの達人たちの間では、これはアクセスSQLで行うことができますか?どうやって?

ご協力いただきありがとうございます。

+0

私は制約#4を理解していません。あなたはそれを言い換えることができますか? "その後、以前のC04を持つ他のすべての行は、それはどういう意味ですか? –

+0

@Unknown Google: Andomarは、#4の文章を逆にして改善したときには非常に正しい:Co3がtでもrでもない後の行がある行を除外する必要があるが、後の行で同じ行Co1とCo2 –

答えて

0

私が正しくあなたを読めば:

のCo3はトンでもRされていない場合は、その後、Co1を とCO2が現在 行と同じであった前にC04を持つすべての 他の行も

を除外されています

これは、特定の条件の後の行が存在する行を除外することに相当します。あなたはNOT EXISTS節でそれを行うことができます:

select * 
from YourTable cur 
where cur.Co3 in ('t','r') 
and not exists (
    select * 
    from YourTable later 
    where cur.Co1 = later.Co1 
    and cur.Co2 = later.Co2 
    and later.Co3 not in ('t','r') 
    and CInt(Mid(later.Co4,2)) > CInt(Mid(cur.Co4,2)) 
) 
order by cur.Co1, cur.Co2 desc, CInt(Mid(cur.Co4,2)) 

N10は通常N5より大きくありません。 CInt(Mid(...、2))は、N10を10に、N5を5に変えます。

+0

ありがとうAndomar、私はそれを少し修正しなければなりませんでしたが、これのすべてがまさに私が必要としていたものです。 –

0

Co4を開始する際の値を考慮したAndomarのクエリの変更順序を決定するために文字コードのASCII値を使用することによって、異なる文字で表示されます。私は範囲がA01 ... A99、B01 ... B99等であると仮定しており、B01はA99よりも "遅い"と考えられるべきです。

select * 
from Table1 cur 
where not exists (
    select 1 
    from Table1 later 
    where cur.Co1 = later.Co1 
    and cur.Co2 = later.Co2 
    and later.Co3 not in ('t','r') 
    and (asc(left(later.Co4,1)) * 100) + CInt(Mid(later.Co4,2)) > (asc(left(cur.Co4,1)) * 100) + CInt(Mid(cur.Co4,2)) 
) 
and cur.Co3 in ('t','r') 
order by cur.Co1, cur.Co2 
0

答えはまだありませんが、回答者の設定コードです。

create table #boost (
    Co1 char(1), 
    Co2 char(1), 
    Co3 char(1), 
    Co4 char(3) 
) 

insert into #boost values ('A', 'k', 't', 'N1') 
insert into #boost values ('B', 'k', 't', 'N2') 
insert into #boost values ('A', 'm', 't', 'N3') 
insert into #boost values ('B', 'k', 'z', 'N4') 
insert into #boost values ('A', 'k', 'z', 'N5') 
insert into #boost values ('C', 'm', 't', 'N6') 
insert into #boost values ('C', 'k', 'z', 'N7') 
insert into #boost values ('C', 'k', 't', 'N8') 
insert into #boost values ('A', 'k', 't', 'N9') 
insert into #boost values ('C', 'm', 't', 'N10') 
+0

あなたがそれを見逃した場合、それはMS Accessの質問です;-) – Andomar

+0

それはリモートでも有効ではありませんAccess SQL:Dさらに、元の投稿への編集であったはずです。 (または担当者がいない場合はコメントしてください) – Oorang